我们计划使用lucene作为FTI服务。除此之外,我们还希望基于文档的标记属性构建标记索引,这些文档只包含空格分隔的标记。
现在建议标记完成,如果有办法访问给定索引的所有唯一关键字,那将会很棒。 Lucene必须能够在内部执行此操作,因为它使用它来完成类似查询以使用OR重写它们。
有什么建议吗?
答案 0 :(得分:5)
使用IndexReader.terms获取代码字段的所有字词值(和文档计数)。
答案 1 :(得分:1)
标记完成需要来自(a)标记列表上的前缀查询(如pytho *),或(b)通过ngram-tokenized字段上的查询(例如,Lucene将python索引为p ,py,pyt,pytho,python在一个单独的字段中。)这两种解决方案都允许您即时执行标记完成查询。
你的建议(以及Coady的回应会给你带来的)是一种更离线的方法,或者你真的不想在查询时运行的东西。这也很好 - 预计标签词典不会实时 - 但请注意,迭代通过IndexReader的术语并不意味着是“查询时”操作。
答案 2 :(得分:1)
注意直接使用索引中的术语。如果在索引时启用了词干,则所有有趣的字符串将开始出现在术语列表中。 “美”被蕴涵为“美”,“创造”被转化为“创造”等等。
答案 3 :(得分:1)
你需要做两件事:
1)创建要编制索引的文档时,请确保使用“ANALYZED
”
doc.add(new Field("tags", tags, Field.Store.NO, Field.Index.ANALYZED));
2)使用布尔查询和OR所有术语:
BooleanQuery query = new BooleanQuery();
for( String tag : tags){
query.add(new TermQuery("tags", tag), BooleanClause.Occur.SHOULD);
}
TopDocs docs = searcher.search(query, null, searchLimit);
答案 4 :(得分:0)
如果您尝试完成标记,则不需要所有唯一标记,您需要的标记与用户已输入的标记相匹配。这可以通过通配符,模糊,跨度或proefix查询来完成,具体取决于需要。