在lucene BooleanQuery中使用空格匹配整个句子

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

Luc*_*ski 3

这里你需要的是一个PhraseQuery. 让我解释。

我不知道您使用的是哪种分析器,但为了简单起见,我假设您有一个非常基本的分析器,它只是将文本转换为小写。不要告诉我您没有使用分析器,因为 Lucene 必须执行任何工作,至少在索引阶段 - 这就是定义标记器和标记过滤器链的原因。

以下是本示例中字符串的标记方式:

  • tulip inn ryiadhh
  • tulip inn ryiadhh luxury
  • suites of tulip inn ryiadhh

请注意它们是如何包含标记序列的tulip inn ryiadhhPhraseQuerya正在寻找的是一系列标记。

在 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通过分析器运行部分查询来为您完成这项工作,但如果您不使用解析器,则必须自己完成此工作。

现在,为什么在这种情况下不起作用WildcardQueryRegexQuery这些查询始终匹配单个术语,但您需要匹配术语的有序序列。例如,WildcardQuery带有该术语的aRiyadhh*将查找以 开头的所有单词Riyadhh

BooleanQuery带有子句集合的ATermQuery MUST将匹配恰好以任意顺序包含这 3 个术语的任何文本 - 也不完全是您想要的。

  • @Raghavan 嗯......“PhraseQuery”不会削减它。您需要一个“SpanNearQuery”,其中包含“SpanMultiTermQueryWrapper”作为第一个和最后一个跨度。其中每一个都会包装一个“WildcardQuery”。但你需要注意的是: 1. Lucene.Net 没有 `SpanMultiTermQueryWrapper` AFAIK,也许它在 v4 预发行版中(如果没有,你需要自己从 Java 版本移植它)和 2. a `WildcardQuery `*something` 形式的 ` 将*极其*低效,因为它必须扫描*完整*索引。我建议您编辑您的问题,以便*更准确地*解释您的要求。 (2认同)