http://m.oschina.net/bbs/thread/7707
/**
*
*/
package test;
import java.io.File;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
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.NIOFSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
/**
* @author george.yin
*
* @email: yinhaofeng@gmai.com
*
* 2010-12-8
*/
public class ScoreDemo {
public final static String INDEX_STORE_PATH = "D:\\dev_root\\install\\eclipse_j2ee\\java\\workspace\\LuceneDemo\\ScoreDemo";
public static void main(String[] args) throws Exception {
boolean createIndex = false;
Directory dic = new NIOFSDirectory(new File(INDEX_STORE_PATH));
Analyzer analyzer = new IKAnalyzer();
if (createIndex) {
IndexWriter writer = new IndexWriter(dic, analyzer, true, MaxFieldLength.UNLIMITED);
writer.setUseCompoundFile(false);
Field nameField;
Field infoField;
Field demoField;
Document doc1 = new Document();
nameField = new Field("Name", "我们", Field.Store.YES, Field.Index.ANALYZED);
nameField.setBoost(100f);
infoField = new Field("Info", "测试1", Field.Store.YES, Field.Index.ANALYZED);
infoField.setBoost(10f);
demoField = new Field("Demo", "测试1", Field.Store.YES, Field.Index.ANALYZED);
demoField.setBoost(5f);
doc1.add(nameField);
doc1.add(infoField);
doc1.add(demoField);
writer.addDocument(doc1);
Document doc2 = new Document();
nameField = new Field("Name", "我们的爱", Field.Store.YES, Field.Index.ANALYZED);
nameField.setBoost(100f);
infoField = new Field("Info", "我们2", Field.Store.YES, Field.Index.ANALYZED);
infoField.setBoost(10f);
demoField = new Field("Demo", "我们测试1", Field.Store.YES, Field.Index.ANALYZED);
demoField.setBoost(5f);
doc2.add(nameField);
doc2.add(infoField);
doc2.add(demoField);
writer.addDocument(doc2);
Document doc3 = new Document();
nameField = new Field("Name", "我们的爱情", Field.Store.YES, Field.Index.ANALYZED);
nameField.setBoost(100f);
infoField = new Field("Info", "测试3", Field.Store.YES, Field.Index.ANALYZED);
infoField.setBoost(10f);
demoField = new Field("Demo", "我们的爱情公式", Field.Store.YES, Field.Index.ANALYZED);
demoField.setBoost(5f);
doc3.add(nameField);
doc3.add(infoField);
doc3.add(demoField);
writer.addDocument(doc3);
Document doc4 = new Document();
nameField = new Field("Name", "我", Field.Store.YES, Field.Index.ANALYZED);
nameField.setBoost(100f);
infoField = new Field("Info", "测试3", Field.Store.YES, Field.Index.ANALYZED);
infoField.setBoost(10f);
demoField = new Field("Demo", "们", Field.Store.YES, Field.Index.ANALYZED);
demoField.setBoost(5f);
doc4.add(nameField);
doc4.add(infoField);
doc4.add(demoField);
writer.addDocument(doc4);
writer.commit();
writer.close();
System.out.println("索引创建成功...");
} else {
IndexSearcher searcher = new IndexSearcher(dic, true);
String searchKey = "我们";
/*
* TermQuery tq;
BooleanQuery bq = new BooleanQuery();
tq = new TermQuery(new Term("Name", "我们"));
bq.add(tq, BooleanClause.Occur.SHOULD);
tq = new TermQuery(new Term("Info", "我们"));
bq.add(tq, BooleanClause.Occur.SHOULD);
*/
String[] fieldStrArr = new String[] { "Name", "Info" ,"Demo"};
MultiFieldQueryParser mfqp = new MultiFieldQueryParser(Version.LUCENE_CURRENT, fieldStrArr, analyzer);
Query query = mfqp.parse(searchKey);
System.out.println("查询条件为:" + query);
TopDocs topDocs = searcher.search(query,10000);
ScoreDoc[] docArr = topDocs.scoreDocs;
System.out.println("命中:" + docArr.length);
int docid = 0;
for (int i = 0; i < docArr.length; i++) {
docid = docArr[i].doc;
Document doc = searcher.doc(docid);
System.out.println("Score :" + docArr[i].score + "Name :" + doc.get("Name") + "\t\t" + "Info :" + doc.get("Info") + "\t\t" + "Demo :" + doc.get("Demo") );
// System.out.println(searcher.explain(q, docid));//
}
}
}
}
分享到:
相关推荐
- **Scoring**: Lucene的评分机制,基于TF-IDF等算法评估文档的相关性。 3. **高级特性**: - **MultiFieldQueryParser**:允许在一个Document的多个Field中进行搜索。 - **Filter**和**QueryWrapperFilter**...
7. **评分(Score)**:Lucene使用TF-IDF算法计算每个匹配文档的相关性分数,得分越高,匹配度越高。 8. **更新与删除(Update & Delete)**:可以通过IndexWriter对索引进行更新,添加新文档或删除旧文档。 9. **分段...
4. **匹配与排序**: Lucene 使用这些查询词在索引中查找匹配的文档,根据评分(Relevance Score)对结果进行排序。 5. **返回结果**: 最后,系统返回得分最高的若干文档作为搜索结果。 ### 3. Lucene 支持的文档...
Lucene允许根据文档的评分(score)或者自定义字段进行排序。评分是基于查询与文档的相关性计算得出的,可以通过Similarity类进行调整。此外,还可以使用FieldDoc排序,依据文档中的某个字段值进行排序。 五、其他...
- **评分函数(Scoring)**: Lucene使用TF-IDF等算法来计算文档的相关性分数。 - **高亮(Highlighting)**: Lucene提供Highlighter类,用于在搜索结果中突出显示匹配的部分。 ### 4. 应用场景 Lucene广泛应用于...
标题与描述均聚焦于“Lucene搜索过程源码解析—Score树”,这表明文章将深入探讨Lucene这一流行的信息检索库在实现搜索功能时的核心机制之一:Score树。Lucene是一个开源的全文检索引擎工具包,它提供了创建索引、...
7. **搜索相关度评分(Score)**:Lucene为每个匹配查询的文档计算一个分数,表示其与查询的相似度。分数的计算涉及多个因素,包括词频(tf)、逆文档频率(idf)、激励因子(boost)和长度规范(lengthNorm)。高...
它包含符合条件的Document的内部编号(doc)及评分(score)。 5) 示例代码: //keyword要搜索的关键字。indexDir索引存放的目录 public static void searcher(String keyword, File indexDir){ IndexSearcher ...
9. **Hit** 和 **Score**:Lucene 使用评分系统来衡量查询与文档的相关性,这就是Score。每次搜索返回的结果集(Hit集合)包含了每个匹配文档的Score。 现在,让我们看看如何通过一个程序例子来使用Lucene 3.5: 1...
6. **搜索器(Searcher)**: 搜索器执行查询,根据索引返回匹配的文档,并根据评分(relevancy score)排序。 **Lucene 示例与 Demo** "lucene示例"通常包含了演示如何使用 Lucene 的代码片段或完整的应用。这些...
- 使用自定义ScoreFunction:根据业务需求,自定义评分函数,使搜索结果更符合用户期望。 - 利用Filter和QueryWrapperFilter:过滤无关文档,提升搜索效率。 五、总结 通过对“lucene全文检索案例源码”的学习,...
9. **Score**:Lucene根据文档与查询的相关性给出一个分数,得分最高的文档被认为是最相关的。 10. **Hit** 和 **Hits**:Hit表示单个搜索结果,而Hits是所有匹配结果的集合。 11. **Filter**:可以用于进一步筛选...
- **TopDocs**: 返回匹配的文档集合,通常包括最高评分的一定数量的文档。 **5. 扩展与优化** Lucene 提供了多种扩展点,比如自定义 Analyzer、Filter 和 Collector,以适应不同场景的需求。例如,可以通过自定义 ...
2. **缓存策略**:利用Lucene的缓存机制,如TermVectorCache和DocumentCache,提升查询速度。 3. **倒排索引优化**:通过调整段合并策略和位图索引,进一步提升搜索效率。 4. **实时索引**:结合NRT(Near Real ...
- **结果排序**:根据文档的评分(Score)对搜索结果进行排序,评分计算涉及到 `Similarity` 类的实现。 - **结果获取**:最后,使用 `Document` 对象从索引中读取搜索结果中的详细信息。 **3. Lucene 源码学习...
Lucene支持两种类型的排序:基于评分(Score Sorting)和基于字段(Field Sorting)。基于评分的排序默认按照相关性排序,即每个文档与查询匹配的程度。而基于字段的排序则可以根据文档的特定字段值进行排序,如日期...
7. 文档评分(Score):Lucene根据查询的相关性对结果进行评分。 二、功能特性 1. 全文检索:支持对文本的精确匹配、模糊匹配、短语查询等多种检索方式。 2. 高效性能:通过倒排索引实现快速的查询响应。 3. 空间...
Lucene 支持基于评分(Score)、文档ID或自定义字段的排序。使用 `Sort` 类定义排序规则,并在执行查询时传递给 `IndexSearcher`。 5. **性能优化** - **批量索引**:一次处理大量文档比逐个添加更高效。 - **...
4. **评分机制**:Lucene 使用TF-IDF(词频-逆文档频率)算法来计算文档与查询的相关性,得分高的文档优先显示。此外,还可以通过自定义评分函数来优化搜索结果。 5. **更新与删除**:Lucene.NET 2.0 支持对已索引...
- **Score**:Lucene会根据相关性对结果进行评分,高分代表更相关。 - ** Hits**:查询结果集,包括匹配的文档及其分数。 - **Hit**:单个匹配的文档,包括文档ID、分数和其他相关信息。 4. **Compass检索框架**...