我正在存储一个包含 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/