solr fieldType定义,用于处理多部分字段字段值

时间:2012-04-11 13:44:32

标签: solr

我在我的应用程序中有solr,我需要涵盖以下场景: 我有一个有三个值的字段: 咖啡店 甜甜圈店 体育用品店

当我搜索“咖啡店”时,我得到所有具有上述任何值的文件。原因是所有人都有“商店”。 我正在尝试改变这种搜索行为,以便当我搜索“咖啡店”时,我只获得有“咖啡店”的文件,当我搜索“商店”时,我得到具有上述所有值的文件。下面是我的fieldType定义

  <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.ReversedWildcardFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory"
                splitOnNumerics="0"
                stemEnglishPossessive="1"
                splitOnCaseChange="1"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="1"
                catenateNumbers="1"
                catenateAll="0"
                preserveOriginal="1"                
                protected="protwords.txt"/>
        <filter class="solr.StopFilterFactory" 
                ignoreCase="true" 
                words="stopwords.txt" 
                enablePositionIncrements="true" /> 
        <filter class="solr.HunspellStemFilterFactory"
                dictionary="en_US.dic"
                affix="en_US.aff"
                ignoreCase="true" />       
      </analyzer>
      <analyzer type="query">        
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <charFilter class="solr.HTMLStripCharFilterFactory"/>        
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.TrimFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory"
                splitOnNumerics="0"
                stemEnglishPossessive="1"
                splitOnCaseChange="1"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="0"
                catenateNumbers="0"
                catenateAll="0"
                preserveOriginal="1"                
                protected="protwords.txt"/>
        <filter class="solr.StopFilterFactory" 
                ignoreCase="true" 
                words="stopwords.txt" 
                enablePositionIncrements="true" />
        <filter class="solr.HunspellStemFilterFactory"
                dictionary="en_US.dic"
                affix="en_US.aff"
                ignoreCase="true" />
      </analyzer>
    </fieldType>

谢谢

2 个答案:

答案 0 :(得分:2)

我似乎有同样的需求,搜索sac à main(法语为handbag)只返回sac的内容,这是我不想要的。但我希望搜索sac以使用sac à main返回内容。

以下是我在网上进行了几个小时的研究后所做的事情:

schema.xml中,至少包含以下参数:

<fieldType name="text" class="solr.TextField" indexed="true" stored="true" multiValued="true" positionIncrementGap="100">
  <analyzer type="index">
    …
    <filter class="solr.SynonymFilterFactory"
      synonyms="fr_expressions.txt"
      ignoreCase="true"
      expand="true" />
    …
  </analyzer>
  <analyzer type="query">
    …
    <filter class="solr.SynonymFilterFactory"
      synonyms="fr_expressions.txt"
      ignoreCase="true"
      expand="false" />
    …
  </analyzer>
</fieldType>

fr_expressions.txt中,这一行如下:

sac_a_main,sac a main,sacs a main

index分析器将全部替换索引文本中的3个值。

query分析器将使用sac_a_main替换查询中的3个值。

搜索sac à main只会找到sac_a_main的内容,但搜索sac也会找到这些内容。

HTH

答案 1 :(得分:0)

在schema.xml中有一个默认运算符,默认为OR。 但是,据说不要依赖它(虽然我将它改为AND)。

假设您正在“描述”字段中搜索,您可以执行以下操作:

描述:“咖啡店”&lt;&lt;&lt;这是一个完全匹配(案例被忽略),按照确切的顺序(我认为没有分离)
描述:(咖啡店)&lt;&lt;&lt;这将匹配包含两个单词的描述,以任何顺序(我认为有任何距离)