java - Lucene 通过 URL 搜索

标签 java indexing lucene full-text-search

我正在存储一个包含 URL 字段的文档:

Document doc = new Document();
doc.add(new Field("url", url, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("text", text, Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("html", CompressionTools.compressString(html), Field.Store.YES));

我希望能够通过其 URL 找到文档,但我得到 0 个结果:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30)
Query query = new QueryParser(LUCENE_VERSION, "url", analyzer).parse(url);
IndexSearcher searcher = new IndexSearcher(index, true);
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
// Display results
for (ScoreDoc hit : hits) {
  System.out.println("FOUND A MATCH");
}
searcher.close();

我可以做些什么不同的事情来存储 HTML 文档并通过其 URL 找到它?

最佳答案

您可以将查询重写为这样的内容

Query query = new QueryParser(LUCENE_VERSION, "url", analyzer).newTermQuery(new Term("url", url)).parse(url);

建议:

我建议您使用 BooleanQuery,因为它提供了良好的性能并且在内部进行了优化。

TermQuery tq= new TermQuery(new Term("url", url));
// BooleanClauses Enum SHOULD says Use this operator for clauses that should appear in the matching documents.
BooleanQuery bq = new BooleanQuery().add(tq,BooleanClause.Occur.SHOULD);
IndexSearcher searcher = new IndexSearcher(index, true);
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
searcher.search(query, collector);

我看到您正在使用 URL frield 作为 Not_Analysed 进行索引,这对于搜索来说是很好的 IMO,因为没有使用分析器,该值将存储为单个术语。

现在,如果您的业务案例说,我会给您一个 URL,从 Lucene 索引中找到EXACT,然后您应该使用不同的分析器(KeywordAnalyzer 等)查看您的索引

关于java - Lucene 通过 URL 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5321388/

相关文章:

Java 安全异常

hadoop - 我如何使用 apache mahout 实现 LDA?

Lucene 5.0.0 - 搜索带有特殊字符的字符串

Python-快速选择函数查找中位数

php - 提高 MySQL 中 2 个左连接和多个 SUM 的性能

database - 任何用于索引和关联外部数据源内容的系统?

azure - Sitecore 8.1 Lucene 未更新 - 如何确定索引是否已完全构建?

java - Spring 3当setter方法重载时如何设置属性

java - Gson 反序列化到 java 对象不起作用

java - 如何在 Android 中保存 FCM token ?