如果所有搜索关键字出现在任何搜索字段的任何位置,我需要将基于Solr的搜索返回结果。
目前情况:
示例搜索查询:keywords: "berlin house john" name: "berlin house john" name" author: "berlin house john" name"
假设只有一个结果,其中keywords =" house",name =" berlin"和author =" john"这三个词没有其他可能的排列。
如果defaultOperator是OR,则Solr返回每个字段中每个关键字的简单OR-ing,这是一个巨大的列表,当然,最佳匹配结果位于第一个位置,但下一个结果很少相关性(可能只有一个字段匹配),它们只会让用户感到困惑。
另一方面,如果我将默认运算符切换到AND,我绝对没有结果。我想它正试图在所有三个字段中找到所有三个单词的完美匹配,当然,这三个字段都不存在。
搜索词从搜索输入到应用程序,用户在其中编写自由文本 - 没有特定的语言约定(主题标签或其他内容)。
我知道我所问的是可能的,因为我之前用纯Lucene做过,而且它有效。我究竟做错了什么?
答案 0 :(得分:3)
如果您只是需要确定,所有单词都出现在所有字段中,我建议您在索引时将所有相关字段复制到一个字段中,然后查询此字段。为此,您需要引入一个新字段,然后对要复制的所有源字段使用copyField
。要复制所有字段,请使用:
<copyField source="*" dest="text"/>
有关详细信息,请参阅http://wiki.apache.org/solr/SchemaXml#Copy_Fields。
类似的方法是在查询时使用布尔代数。这与上述解决方案略有不同。
您的查询应该是
(keywords:"berlin" OR keywords:"house" OR keywords:"john") AND
(name:"berlin" OR name:"house" OR name:"john") AND
(author:"berlin" OR author:"house" OR author:"john")
基本上指出:关键字中必须匹配一个或多个字词, name 中必须匹配一个或多个字词,且 author中必须匹配一个或多个字词。
答案 1 :(得分:1)
从Solr 4开始,不推荐使用defaultOperator。请不要使用它。 另外,对于我来说,defaultOperator与查询中的指定运算符一样。我不能说它为什么,只是我的经验。
请尝试使用param {!q.op = AND}
查询我猜您使用默认查询解析器,如果我错了就修复我