现在开发搜索系统,使用的是开源界比较推崇的Lucene,版本是Maven库上面的3.5,这个版本里面有很多方法都不建议使用了。所以代码创建的方式
有那么点变化,我使用的分词器是IkAnalyzer。Lucene全文检索的功能是很强大的,我们在做电子商务系统的时候肯定是会遇到排序的问题,比如
销量,比如价格等等,为了方便客户我们便需要Lucene的排序功能,其实Lucene中的排序很简单也很方便,我们在创建搜索器的时候增加一个Sort
就行了,Sort的构造函数需要SortField,具体大家可以去参考Lucene的源代码,我下面写了一个简单的例子来演示怎么使用。代码如下:
import java.io.IOException;
import java.util.Locale;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.FieldComparator;
import org.apache.lucene.search.FieldComparatorSource;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;
public class LuceneSortTest {
/**
* Lucene排序查询
*/
@Test
public void testSort() throws Exception{
String name = "name";
String field = "price";
String names[] = {"衣服","睡衣","漂亮衣服","好看衣服","男士衣服","女士衣服"};
double price[] = {12.0,13.0,8.8,9.6,7.5,12.1};
RAMDirectory dir = new RAMDirectory();
Analyzer analyzer = new IKAnalyzer();
IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_35, analyzer);
IndexWriter writer = new IndexWriter(dir, cfg);
for (int i=0;i<names.length;i++) {
Document doc = new Document();
doc.add(new Field(name, names[i], Store.YES, Index.ANALYZED));
doc.add(new Field(field, String.valueOf(price[i]), Store.YES, Index.NOT_ANALYZED));
writer.addDocument(doc);
}
writer.commit();
writer.close();
IndexReader reader = IndexReader.open(dir);
Query query = IKQueryParser.parse(name, "衣服");
Sort sort = new Sort(new SortField(field,SortField.DOUBLE,true)); //排序 false 升序 true降序
IndexSearcher isearcher = new IndexSearcher(reader);
isearcher.setSimilarity(new IKSimilarity());
TopDocs topDocs = isearcher.search(query, 5, sort);
ScoreDoc scoreDocs[] = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
Document doc = isearcher.doc(scoreDoc.doc);
System.out.println(doc.get(field));
}
isearcher.close();
dir.close();
}
}
这段代码执行的结果为:
12.1
12.0
9.6
8.8
7.5
在SortField里面有很多静态常量来提供给排序器作为排序的依据,Lucene里面自己定义好的排序实现已经基本能够满足我们的需求了,如果自己想定义一个自己的排序算法,那么可以继承FieldComparatorSource实现里面的方法:
public FieldComparator newComparator(String fieldname, int numHits,
int sortPos, boolean reversed) throws IOException {
// TODO Auto-generated method stub
return new DoubleFieldComparatorSource.DoubleFieldComparator();
}
里面的FieldComparator是一个抽象类,主要就是用来作比较使用的,定义自己的排序算法关键也在于继承这个抽象类,然后实现里面的方法,需要实现的方法如下:
class DoubleFieldComparator extends FieldComparator{
@Override
public int compare(int slot1, int slot2) {
return 0;
}
@Override
public void setBottom(int slot) {
}
@Override
public int compareBottom(int doc) throws IOException {
return 0;
}
@Override
public void copy(int slot, int doc) throws IOException {ub
}
@Override
public void setNextReader(IndexReader reader, int docBase)
throws IOException {
}
@Override
public Object value(int slot) {
return null;
}
}
这里顺便列出Sort已经提供的比较值:
SortField.SCORE 按积分排序
SortField.DOC 按文档排序
SortField.AUTO 域的值为int、long、float都有效
SortField.STRING 域按STRING排序
SortField.FLOAT
SortField.LONG
SortField.DOUBLE
SortField.SHORT
SortField.CUSTOM 通过比较器排序
SortField.BYTE
源地址:http://www.javafans.org/article/99
分享到:
相关推荐
因此,了解如何在 Lucene 中实现自定义排序是非常关键的。在这个话题中,我们将深入探讨如何根据特定的业务需求对搜索结果进行定制排序。 首先,我们要明白 Lucene 默认的排序机制。默认情况下,Lucene 搜索结果是...
本文将深入探讨“Lucene5学习之自定义排序”这一主题,帮助你理解如何在Lucene5中实现自定义的排序规则。 首先,Lucene的核心功能之一就是提供高效的全文检索能力,但默认的搜索结果排序通常是基于相关度得分...
本文将深入探讨Lucene如何根据关键词出现次数进行排序,以及如何实现自定义排序,包括处理`List<Map>`字段的情况,并结合项目中的`pom.xml`配置来解析这一过程。 首先,Lucene默认的排序方式是基于文档的相关性,即...
Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和ScoreDocComparator接口.在...
深入了解 Lucene 之三排序算法 ...Lucene 的排序算法是基于 tf-idf 模型的,通过 tf、idf、coord、queryNorm、norm 等评分因子来计算文档的分数,并提供了丰富的 API 使用户可以实现自定义的排序算法。
本文将深入探讨如何在 Lucene 中实现自定义评分,以及它对提高搜索质量的重要性。 在 Lucene 中,每个匹配文档都会有一个评分,这个评分通常基于 TF-IDF(词频-逆文档频率)算法,它是衡量一个词在文档中重要性的...
这篇博客“Lucene5学习之自定义Collector”显然聚焦于如何在Lucene 5版本中通过自定义Collector来优化搜索结果的收集过程。Collector是Lucene搜索框架中的一个重要组件,它负责在搜索过程中收集匹配的文档,并根据...
5. **Sorting**:在Lucene中,我们可以自定义排序规则,包括基于地理位置的距离排序。这可以通过实现`SortComparatorSource`接口来自定义比较器,或者使用`FieldComparatorSource`来创建一个基于特定字段(如地理...
3. **自定义排序**:除了相关性,我们还可以根据文档的其他字段(如日期、价格等)进行排序。这需要定义`FieldComparatorSource`和`FieldComparator`,以实现自定义比较逻辑。 4. **SortField类型**:`SortField`...
在Lucene4.x版本中,排序功能有了新的变化,本文将详细介绍如何利用Lucene实现文档的排序以及加分策略。 首先,Lucene的默认排序方式是基于文档得分,即通过TF-IDF(词频-逆文档频率)算法来评估文档与查询的相关度...
综上所述,这个项目展示了如何利用SSH框架与Lucene搜索引擎技术,实现一个功能完备的新闻搜索系统,包括高效搜索、结果排序、分页展示以及关键词高亮等特性。这样的系统对于提升新闻网站的用户体验具有重要意义。
本文将深入探讨Lucene5中的Filter机制,以及其在实际应用中的价值。 首先,我们来理解一下什么是Filter。在Lucene中,Filter是一个抽象类,它提供了一种方式来限制搜索结果,而不必修改Query本身。这使得搜索性能...
**C#与Lucene.Net构建自定义Web搜索引擎** 在信息技术高速发展的今天,搜索引擎已经成为人们获取信息的重要工具。本文将深入探讨如何使用C#编程语言和Lucene.Net库来开发一个自定义的Web搜索引擎,帮助开发者了解这...
向量空间模型是Lucene排序算法的基础,由Gerald Salton等人在30多年前提出。该模型假设文档和查询的相关性可以通过它们共有的词汇来衡量。经典的TF-IDF(词频-逆文档频率)公式用于计算词项权重。文档d和查询q的...
标题中的“lucene.net以及高亮的DLL文件”指的是在.NET环境中使用Lucene搜索引擎库时,涉及到了文本高亮显示的DLL组件。Lucene.Net是一个开源的全文检索库,它是Apache Lucene项目针对.NET Framework的移植版本,为...
了解这些基础知识后,你可以进一步探索Lucene的高级特性,如多字段搜索、模糊匹配、排序和分页等,以满足更复杂的搜索需求。同时,也可以研究如何优化IK Analyzer的配置,以适应特定的分词需求。
结合以上文件,我们可以看到Lucene-2.0的学习不仅需要理解基本的索引构建和搜索原理,还需要掌握如何自定义排序规则和分析器以满足特定需求。此外,通过阅读和分析这些源码,开发者还可以深入理解Lucene的内部工作...