Solr:使用标点符号处理查询

时间:2017-07-06 00:33:28

标签: solr punctuation

我在schema.xml中有以下字段:

 <field name="content" type="text_snowballstem" indexed="true" stored="true" multiValued="true" omitNorms="false" termVectors="true" />

字段类型定义:

  <fieldType name="text_snowballstem" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
          <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          <filter class="solr.ASCIIFoldingFilterFactory"/>
          <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
          <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
          <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
        catenateWords="1" catenateNumbers="1" catenateAll="1"
        splitOnCaseChange="1" splitOnNumerics="1"
        stemEnglishPossessive="1" preserveOriginal="1" />
          <filter class="solr.LowerCaseFilterFactory"/>
          <filter class="solr.KeywordRepeatFilterFactory"/>
          <filter class="solr.SnowballPorterFilterFactory" protected="no_stemming.txt"/>
          <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>        
  </fieldType>

现在,让我们说索尔索引2条记录,内容为:

  • “选择与其描述不符的项目:”
  • “描述”

对于此查询

content:"description"

solr将返回2条记录。这是我们所期望的。但是对于查询

content:"descirption\:" 

它还返回2条记录。为什么在这里忽略冒号?我希望在结果中只收到1条记录。

感谢任何建议。

UPD

我已对WordDelimeterFilterFactory实施了建议的更改:

 <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
        catenateWords="1" catenateNumbers="1" catenateAll="1"
        splitOnCaseChange="1" splitOnNumerics="1"
        stemEnglishPossessive="1" preserveOriginal="1" types="nosplit.txt"/>

nosplit.txt文件:

# Don't split numbers at '$', '.' or ':'
: => ALPHA
$ => ALPHA
. => ALPHA
- => ALPHA

然而,Solr分析器仍显示content:description: enter image description here

的2个令牌

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

第一种方法

WordDelimiterFilterFactory 说明生成两个令牌:

  1. 描述:
  2. 描述
  3. 你可以检查一下。只需在solr管理界面进行分析即可。选择fieldType并粘贴数据,然后您就可以看到相应的标记。

    这就是为什么当你搜索描述时,描述:也会出现在结果中 我们可以控制 WDF 不会在冒号上拆分的行为。

    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
            catenateWords="1" catenateNumbers="1" catenateAll="1"
            splitOnCaseChange="1" splitOnNumerics="1"
            stemEnglishPossessive="1" preserveOriginal="1" types="nosplit.txt"/>
    

    [<强> nosplit.txt

    # Don't split numbers at '$', '.' or ':'
    : => ALPHA
    $ => ALPHA
    . => ALPHA
    

    我添加了一个类型参数,它将改变 WDF 的拆分行为。在此之后它将只产生第一个令牌而不是第二个令牌。
    P.S: - 类型参数从6.5开始可用。因此,如果您使用的是旧版本,则无法使用。

    第二种方法

    您可以使用受保护的参数

      

    protected :(可选)包含列表的文件的路径名   受保护的词语应该在不分裂的情况下传递。

    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
            catenateWords="1" catenateNumbers="1" catenateAll="1"
            splitOnCaseChange="1" splitOnNumerics="1"
            stemEnglishPossessive="1" preserveOriginal="1" protected="prot.txt"/>
    

    [prot.txt]

    description:
    

    此功能在Solr 5和6中均可用。

    第3种方法

    您可以使用原始查询解析器。此查询解析器搜索输入测试,无需任何文本分析或转换。

    {!raw f=content}description\: