我有一个系统使用lucene根据用户提供的查询搜索文档。 当用户的查询包含多个单词时,我创建一个SpanNearQuery,每个单词作为term,最后一个术语是前缀查询的包装(和span = 0)。 例如,如果用户输入是 “新y” 这应该与“新年”和“纽约”相匹配
这样可行,但如果查询的相同的字两次,例如“bora bora”, 即使是有一个“bora”外观的文件也是匹配的。
我怎样才能匹配“bora bora *”?
代码:
String[] words = querystr.split(" ");
SpanQuery[] clauses = new SpanQuery[words.length];
for (int i = 0; i < words.length; i++) {
if (allWordsPrefix || i == words.length - 1)
{
PrefixQuery pq = new PrefixQuery(new Term(LOWER_VALUE, words[i]));
clausesWildCard[i] = new SpanMultiTermQueryWrapper<PrefixQuery>(
}
else
{
Term clause = new Term(LOWER_VALUE, words[i]);
clausesWildCard[i] = new SpanTermQuery(clause);
}
}
SpanQuery allTheWords = new SpanNearQuery(clausesWildCard, 0, false);
修改 我发现这似乎是一个已知的问题 https://issues.apache.org/jira/browse/LUCENE-5932 https://issues.apache.org/jira/browse/LUCENE-3120
但我不明白这是否已解决或有解决方法。
升级到lucene 5.0.0,但它仍然是hapenning ......
答案 0 :(得分:0)
在构建索引时是否使用了shingle过滤器?这是我提出的解决方案。简而言之,每个连续的单词对都必须是索引。因此,例如(忽略停止词),“快速的棕色狐狸跳过懒狗”除了每个索引的单词也会有“快速”,“快速棕色”,棕色狐狸“,”狐狸跳“等等。
也许其他人可能有更好的解决方案。