0

我在 Umbraco 中使用 Examine 来查询内容节点的 Lucene 索引。我有一个字段“completeNodeText”,它是所有节点属性的串联(为了保持简单而不是跨多个字段搜索)。

我接受用户提交的搜索词。当搜索词是多个词(即“firstterm secondterm”)时,我希望得到的查询是 OR 查询:让我返回 fullNodeText 是 firstterm OR secondterm 的结果。

我想:

{+completeNodeText:"firstterm ? secondterm"}

但相反,我得到:

{+completeNodeText:"firstterm secondterm"}

如果我搜索“firstterm OR secondterm”而不是“firstterm secondterm”,那么生成的查询是正确的:{+completeNodeText:"firstterm ? secondterm"}

我正在使用以下 API 调用:

var searcher = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"];
var searchCriteria = searcher.CreateSearchCriteria();
var query = searchCriteria.Field("completeNodeText", term).Compile();

有没有一种简单的方法可以强制检查生成这个“或”查询?或者我是否必须通过调用 StandardAnalyzer 来标记用户输入并通过遍历标记将查询连接在一起来手动构造原始查询?并绕过整个 Examine fluent 查询 API?

4

1 回答 1

1

我不认为问号意味着你认为它意味着什么。

看起来您正在生成一个 PhraseQuery,但您需要两个不相交的 TermQuery。在Lucene 查询语法中,短语查询用引号括起来。

"firstterm secondterm"

短语查询正在寻找该短语,这两个词是按顺序连续出现的。在短语查询中放置一个OR不会执行任何类型的布尔逻辑,而是将其视为单词“OR”。问号是一个占位符,使用 inPhraseQuery.toString()表示已删除的停用词(参见#Lucene-1396)。您仍在执行一个短语查询,但现在它需要一个三词短语firstterm,后跟一个已删除的停用词,然后是secondterm

要简单地搜索两个单独的术语,请去掉引号。

 firstterm secondterm

将搜索具有其中任何一个术语的任何文档(对具有这两个术语的文档给予更高的分数)。

于 2013-09-09T23:17:26.303 回答