我在Umbraco中使用Examine来查询内容节点的Lucene索引。我有一个字段“completeNodeText”,它是所有节点属性的串联(为了保持简单而不是在多个字段中搜索)。
我接受用户提交的搜索字词。当搜索词是多个单词(即“firstterm secondterm”)时,我希望得到的查询是一个OR查询:给我带回fullNodeText为firstterm或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();
是否有一种简单的方法可以强制检查生成此“OR”查询?或者我是否必须通过调用StandardAnalyzer手动构建原始查询来标记用户输入并通过迭代标记将查询连接在一起?并绕过整个Examine fluent查询API?
答案 0 :(得分:1)
我不认为问号意味着你认为它意味着什么。
看起来您正在生成PhraseQuery,但您需要两个不相交的TermQueries。在Lucene query syntax中,短语查询用引号括起来。
"firstterm secondterm"
短语查询正在查找该短语,其中两个术语连续出现,并按顺序显示。在短语查询中放置OR
不会执行任何类型的布尔逻辑,而是将其视为单词“OR”。问号是占位符,在PhraseQuery.toString()
中使用以表示已移除的停用词(请参阅#Lucene-1396)。您仍然在执行一个词组查询,但现在它需要一个三字短语firstterm
,然后是一个删除的停用词,然后是secondterm
要简单地搜索两个单独的术语,请删除引号。
firstterm secondterm
将使用这两个术语中的任何一个搜索任何文档(对两个文档都给予较高分数)。