3

我的应用程序中有 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>

谢谢你

4

2 回答 2

2

似乎我有同样的需求,搜索sac à mainhandbag法语)返回内容 only 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 个值中的任何一个。

分析器会将查询中的 3 个值中的query任何一个替换为sac_a_main.

然后搜索sac à main将只找到具有 的内容sac_a_main,但搜索sac也会找到这些内容以及其他内容。

高温高压

于 2012-10-22T08:33:13.507 回答
0

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

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

描述:“咖啡店” <<< 这是一个完全匹配(忽略大小写),按确切顺序(我认为没有分隔)
描述:(咖啡店) <<< 这将匹配包含两个单词的描述,在任何订单(我认为有任何距离)

于 2012-04-11T15:13:49.160 回答