Lucene – 短语中的通配符

我目前正在尝试使用Lucene来搜索索引中填充的数据。

我可以通过将其括在括号中来匹配精确的短语(即“处理文档”),但不能让Lucene通过执行任何类型的“处理文档*”来找到该短语。

最明显的区别是最后的通配符。

我目前正在尝试使用Luke来查看和搜索索引。 (解析时,它会在短语末尾删除星号)

在数据周围添加引号似乎是主要的罪魁祸首,因为搜索文档*会起作用,但“文档*”不会

任何帮助将不胜感激

QueryParser不仅不支持短语中的通配符,PhraseQuery本身也只支持条款。 MultiPhraseQuery更接近,但正如其摘要所述,您仍需要自己枚举IndexReader.terms以匹配通配符。

Lucene 2.9具有ComplexPhraseQueryParser ,可以处理短语中的通配符。

您正在寻找的是FuzzyQuery ,它允许人们根据Levenshtein距离搜索具有相似单词的结果。 或者,如果单词的顺序不重要,您可能还需要考虑使用PhraseQuery的slop ( 也可在MultiPhraseQuery中使用 )。

似乎默认的QueryParser无法处理这个问题。 您可以在短语中为通配符创建自定义QueryParser。 如果您的示例具有代表性,那么词干就可以解决您的问题。 请阅读PorterStemFilter的文档,看它是否合适。

另一种选择是使用NGrams,特别是EdgeNGram。 http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory

这将为ngrams或部分单词创建索引。 最小ngram大小为5,最大ngram大小为8的文档将索引:Docum Docume文档文档

索引大小和时间有一点权衡。 其中一本Solr书籍引用作为粗略指南:索引需要10倍的时间使用5倍的磁盘空间创建6倍的不同术语。

但是,EdgeNGram会做得更好。

您需要确保不在查询中提交通配符。 由于您没有进行通配符搜索,因此您在ngrams(单词部分)上匹配搜索词。

我也在寻找相同的东西,我发现的是PrefixQuery给你一些像“处理文档*”这样的东西的组合。但是你要搜索的东西应该是未加入的并且以小写forms存储(原因为所以,因为它是未加密的索引器不会保存你的字段值小写)这是为了工作。这是PrefixQuery的代码,对我有用: –

List results = new List(); Lucene.Net.Store.Directory searchDir = FSDirectory.GetDirectory(this._indexLocation, false); IndexSearcher searcher = new IndexSearcher( searchDir ); Hits hits; BooleanQuery query = new BooleanQuery(); query.Add(new PrefixQuery(new Term(FILE_NAME_KEY, keyWords.ToLower())), BooleanClause.Occur.MUST); hits = searcher.Search(query); this.FillResults(hits, results); 

使用斜率为0的SpanNearQuery 。

不幸的是,Lucene.Net中没有SpanWildcardQuery。 您需要使用SpanMultiTermQueryWrapper ,或者只需很少的努力就可以将Java版本转换为C#。