我正在使用 solr4.1.0,我正在尝试让常用词短语搜索工作。这意味着在搜索“the cat”时,我希望显示包含该短语的文档,而不是在某处或不同字段中包含“the”和“cat”的文档。
我有的:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.CommonGramsFilterFactory" words="lang/stopwords.txt" format="snowball" />
<filter class="solr.StopFilterFactory" words="lang/stopwords.txt" format="snowball" enablePositionIncrements="true" />
</analyzer>
</fieldType>
当“正常”单词与 stopwords.txt 中的停用词组合时,这应该输出特殊的 gram 标记。在分析视图中,这按预期工作,因此“the cat”被通用语法化为“the_cat cat”。
我的客户所追求的解决方案是,当查询中的停用词与普通词一起使用时,只有具有此确切短语(停用词 2-shingle)的元素应该匹配。整体默认运算符仍然是 AND。
例如,我有以下字段的文档
- 编号:1;标题:我的猫在它的自然环境中;desc: 世界上最好的动物是猫
- 编号:2;标题:猫是邪恶的;描述:每个人都知道猫是纯粹的邪恶
- 编号:3;标题:猫解谜;desc: 我们的猫叫夏洛克
以下是我想要实现的示例......基本上,用户在搜索、查询和运算符方面或多或少是文盲,因此搜索应该解释输入并“做正确的事”。正确的做法是:
- 输入:cat
结果:docs 1、2、3(为方便起见,没有评分) - 输入:cat world
结果:doc 1
AND 是默认值 - 输入:cat 每个人
结果:doc 2
AND 跨越多个字段 - 输入:猫
结果:doc 1 因为只有这个字段包含短语“猫”,在查询过程中不知何故必须神奇地出现 - 输入:nice cat
结果:[]
因为没有文档包含短语“the nice”,算法会将其解释为常用词短语 - 输入:猫世界
结果:doc 1 - 输入:纯结果:[]
这背后的原因是客户对一些(精心挑选的)停用词有一些具体的想法。
那么这是一种现实的做法吗?在将其传递给 solr 之前是否有必要进行某种查询预解析?还有其他方法可以达到预期的效果吗?