Lucene - 短语中的通配符

时间:2009-07-06 18:33:56

标签: c# .net lucene lucene.net

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

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

明显不同的是最后的通配符。

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

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

非常感谢任何帮助

7 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

这将为ngrams或部分单词创建索引。 最小ngram大小为5且最大ngram大小为8的文档将索引: 解决的文 DOCUME 文献 文件

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

然而,EdgeNGram会做得更好。

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

答案 5 :(得分:0)

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

List<SearchResult> results = new List<SearchResult>();
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);

答案 6 :(得分:0)

使用斜率为0的SpanNearQuery

不幸的是,Lucene.Net中没有Spa通配符查询。您需要使用SpanMultiTermQueryWrapper,或者只需很少的努力就可以将java version转换为C#。