lucene内置的排序方式是按照一定算法的score来排列,document的boost能影响文档的权重,但与关键字并无法实现直接的关系。
比如说对文档一加了100的boost。那么无论搜什么关键字,这个文档都有可能出现在最前面。这个结果并不是我们期望的效果。
有一个办法可以实现按照关键字的排序。
例如:关键字 玻璃
在这个购买了关键字的公司的相关信息document创建lucene索引时。需要人为的添加一个字段.这个数据与用户发付费有关。而与真实信息无关。
Field field=new Field("玻璃","玻璃 玻璃 玻璃")
field name 为什么这样写,在下面搜索的是就知道了。
document.add(field);
根据lucene score 算法。重复2次的score最高。不过这个score的分值与ANALYZER有关系,不同的ANALYZER重复次数不一样。根据lucene score的算法明显和重复次数不是线性的。
这里是一些测试数据
当关键字是n个字长。ANALYZER=WhitespaceAnalyzer
按照score分值,从高到低 关键字的重复频率应该为 2 5 17 8 11 6 16 20 10 15 19 7 18 14 3 9 4 13 12
如果用WhitespaceAnalyzer,这个频率是固定。不管n个字是什么.
都是这样排列。
import java.io.IOException;
import junit.framework.TestCase;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import com.linkmd.search.constants.XmlConstants;
/**
* <b>按照购买的关键字来排序</b>
* @since 2009-5-7
* @version 1.0
*/
public class KeywordSearchTest extends TestCase {
private static final Analyzer ANALYZER = new WhitespaceAnalyzer();
private static final String[] PAY_KEY ={ "芯片","大脑","大菠萝","家乐福"};
private static final int comNumber=20;
private static final int[][] result=new int[2][comNumber];
/**
* @throws Exception
*/
@SuppressWarnings( { "static-access", "deprecation" })
public void testSearch2() throws Exception {
for(int y=0,len=PAY_KEY.length;y<len;y++){
System.out.println("PAY_KEY.length:"+PAY_KEY[y].length());
test(y);
System.out.println();
}
}
private void test(int y) throws CorruptIndexException,
LockObtainFailedException, IOException, ParseException {
Directory ram = new RAMDirectory();
IndexWriter writer = new IndexWriter(ram, ANALYZER, true,
MaxFieldLength.UNLIMITED);
for (int i = 0; i <comNumber; i++) {
Document doc = new Document();
Field field = new Field("companyName", "公司" + i,
Field.Store.YES, Field.Index.NOT_ANALYZED);
doc.add(field);
/**
* 付费字段 关键字设置
*/
StringBuilder key = new StringBuilder();
String finalKey = "";
if (i % 1 == 0) {
for (int x = 0; x < i; x++) {
key.append(this.PAY_KEY[y]);
key.append(" ");
}
finalKey = key.toString();
}
Field payField = new Field("pay_key_word", finalKey,
Field.Store.YES, Field.Index.ANALYZED);
doc.add(payField);
writer.addDocument(doc);
// System.out.println(doc);
}
writer.close();
IndexSearcher searcher = new IndexSearcher(ram);
QueryParser p = new QueryParser("pay_key_word", ANALYZER);
Query q = p.parse(this.PAY_KEY[y]);
Hits hits = searcher.search(q);
System.out.println("total:"+hits.length());
for (int i = 0, size = hits.length(); i < size; i++) {
Document doc = hits.doc(i);
int length = doc.getField("pay_key_word").toString().split(" ").length;
System.out.print(length+" ");
}
searcher.close();
}
}
现在索引已经建好了。搜索的时候。如果某一个用户输入了玻璃。应该先去数据库查一下,是否这个关键字已经被购买。如果购买了,那么在查询的时刻,我们需要在query的构造上加入
"玻璃":"玻璃"。然后sort数组加上 "玻璃",然后是普通的字段,比如 info 字段的 玻璃 这样查询的顺序就应该按照我们的意思来排序了。
我需要先试试效果。应该可行。
不过其实要实现 关键字 还有很多办法。当然直接结合数据库也可以实现。
社区购物 彤瑶诗佳西兴店正品名牌全场四折
分享到:
相关推荐
在Eclipse环境中运用java,Lucene建索引及查询关键字
总结来说,利用Lucene实现文档关键字检索,主要涉及以下几个步骤:1) 文档预处理;2) 创建索引;3) 构建查询;4) 执行查询并获取结果;5) 高亮显示检索内容。这个过程涉及到Lucene的核心组件,包括Analyzer、...
在Lucene5中,Highlighter组件为搜索结果提供了一个强大的关键字高亮机制,使得用户可以快速定位到与查询相关的重要部分。 首先,我们要理解Highlighter的基本工作原理。当用户输入查询后,搜索引擎返回匹配的文档...
《深入探索Lucene5:Suggest关键字提示技术》 在信息检索领域,用户输入查询时,提供快速、准确的关键字提示能显著提升用户体验。Lucene,作为Java领域最流行的全文检索库,其5.x版本引入了Suggest组件,用于实现...
在Android平台上实现全文检索并高亮关键字是一项技术挑战,但通过集成Apache Lucene库,可以有效地解决这个问题。Apache Lucene是一个高性能、可扩展的信息检索库,它为开发人员提供了强大的文本搜索功能。以下是对...
下面我们将深入探讨如何在Android环境中利用Lucene来创建一个高效、功能丰富的全文检索系统,并了解如何高亮显示搜索结果中的关键字。 首先,我们要理解全文检索的基本原理。全文检索是指通过建立倒排索引来快速...
在描述中提到的"JAVA全局文件夹搜索案例",是指使用Lucene实现的Java程序,可以遍历指定的文件夹,对其中的文件内容进行索引,然后根据用户输入的关键字进行实时搜索。这样的案例有助于初学者理解Lucene如何与文件...
创建索引 一、创建词法分析器 二、创建索引存储目录 三、创建索引写入器 四、将内容存储到索引 关键字查询 一、创建索引存储目录读取器 二、创建索引搜索器 三、解析查询 四、获取结果
在这个“Lucene3.0增删改查和关键字高亮实例”项目中,我们将深入理解如何利用Lucene 3.0版本进行索引构建、文档的增删改查操作,并学习关键字高亮显示的实现方法。 首先,我们要了解**创建索引**的基本流程。在...
总结来说,这个压缩包提供了在Android环境下利用Apache Lucene实现全文检索和关键字高亮的示例代码,对于想学习这一技术的开发者来说是一个宝贵的资源。尽管可能需要一定的调整和优化才能在实际项目中应用,但通过...
Lucene的索引机制基于倒排索引,这种技术通过牺牲存储空间来换取快速的检索速度。在索引过程中,Lucene会对输入的文本进行分词,创建一个词项到文档位置的映射。当进行查询时,系统会快速定位到包含查询词的文档,而...
### 利用Lucene实现高级搜索的关键知识点 #### Lucene简介 Lucene是Apache软件基金会下的一个开源全文检索库,提供了高性能的文本搜索能力。它不仅适用于网站的搜索功能,还可以用于任何需要文本搜索的应用场景,如...
这个示例代码将向我们展示如何使用Lucene来创建一个索引,并执行一个包含"java"关键字的查询。 首先,我们需要导入必要的Lucene库,包括核心类库和其他可能需要的模块,例如分析器(Analyzer)和文档(Document)...
《基于Lucene和Heritrix的职位垂直搜索引擎的设计与实现》是一篇深入探讨搜索引擎技术在特定领域的应用的优秀研究生毕业论文。这篇论文的核心是利用开源工具Lucene和Heritrix来构建一个针对职位信息的垂直搜索引擎,...
- Lucene的核心机制是倒排索引,它将每个词项映射到包含该词项的文档列表,极大地提高了搜索效率。 5. **优化与更新**: - `Optimize()`方法用于合并索引段,减少索引文件的数量,提高搜索性能。 - `Commit()`和...
“Lucene与数据库结合示例(加双关键字高亮)”这个标题表明,我们将讨论如何将开源全文搜索引擎Lucene与关系型数据库MySQL整合在一起,并且在搜索结果中实现关键词高亮显示,以提升用户体验。这通常涉及到数据的...
利用lucene进行搜索,IndexSearcher是整个Lucene搜索查询相关信息的驱动引擎,在使IndexSearcher之前,需要构建IndexSearcher对象,Lucene提供了两种构建IndexSearcher对象的方式: 1、基于Directory对象构建; 2...
本篇文章将详细探讨如何在C#环境下利用Lucene实现快速搜索。 首先,让我们了解Lucene的基本概念。Lucene是一个开源的Java库,提供了索引和搜索文本的高级工具。它能够对文本进行分词,建立倒排索引,并支持布尔查询...