1

我正在使用 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. 编号:1;标题:我的猫在它的自然环境中;desc: 世界上最好的动物是猫
  2. 编号:2;标题:猫是邪恶的;描述:每个人都知道猫是纯粹的邪恶
  3. 编号:3;标题:猫解谜;desc: 我们的猫叫夏洛克

以下是我想要实现的示例......基本上,用户在搜索、查询和运算符方面或多或少是文盲,因此搜索应该解释输入并“做正确的事”。正确的做法是:

  1. 输入:cat
    结果:docs 1、2、3(为方便起见,没有评分)
  2. 输入:cat world
    结果:doc 1
    AND 是默认值
  3. 输入:cat 每个人
    结果:doc 2
    AND 跨越多个字段
  4. 输入:猫
    结果:doc 1 因为只有这个字段包含短语“猫”,在查询过程中不知何故必须神奇地出现
  5. 输入:nice cat
    结果:[]
    因为没有文档包含短语“the nice”,算法会将其解释为常用词短语
  6. 输入:猫世界
    结果:doc 1
  7. 输入:纯结果:[]

这背后的原因是客户对一些(精心挑选的)停用词有一些具体的想法。
那么这是一种现实的做法吗?在将其传递给 solr 之前是否有必要进行某种查询预解析?还有其他方法可以达到预期的效果吗?

4

0 回答 0