Rag*_*van 6 lucene solr lucene.net
我有一个搜索字符串,
Tulip INN Riyadhh
Tulip INN Riyadhh LUXURY
Suites of Tulip INN RIYAHdhh
Run Code Online (Sandbox Code Playgroud)
如果我提到的话,我需要搜索词
*Tulip INN Riyadhh*
Run Code Online (Sandbox Code Playgroud)
它必须返回上面的所有三个,我有限制,我必须实现这个没有QueryParser或Analyzer,它必须只有BooleanQuery/WildCardQuery /等....
此致,Raghavan
这里你需要的是一个PhraseQuery
. 让我解释。
我不知道您使用的是哪种分析器,但为了简单起见,我假设您有一个非常基本的分析器,它只是将文本转换为小写。不要告诉我您没有使用分析器,因为 Lucene 必须执行任何工作,至少在索引阶段 - 这就是定义标记器和标记过滤器链的原因。
以下是本示例中字符串的标记方式:
tulip
inn
ryiadhh
tulip
inn
ryiadhh
luxury
suites
of
tulip
inn
ryiadhh
请注意它们是如何包含标记序列的tulip
inn
ryiadhh
。PhraseQuery
a正在寻找的是一系列标记。
在 Lucene.Net 中构建这样的查询如下所示(未经测试):
var query = new PhraseQuery();
query.Add(new Term("propertyName", "tulip"));
query.Add(new Term("propertyName", "inn"));
query.Add(new Term("propertyName", "ryiadhh"));
Run Code Online (Sandbox Code Playgroud)
请注意,这些术语需要与分析器生成的术语相匹配(在本例中,它们都是小写的)。它QueryParser
通过分析器运行部分查询来为您完成这项工作,但如果您不使用解析器,则必须自己完成此工作。
现在,为什么在这种情况下不起作用WildcardQuery
?RegexQuery
这些查询始终匹配单个术语,但您需要匹配术语的有序序列。例如,WildcardQuery
带有该术语的aRiyadhh*
将查找以 开头的所有单词Riyadhh
。
BooleanQuery
带有子句集合的ATermQuery
MUST
将匹配恰好以任意顺序包含这 3 个术语的任何文本 - 也不完全是您想要的。