Solr 5.1:包含下划线的搜索查询的问题

时间:2015-09-03 14:35:10

标签: solr solr5

我使用Solr 5.1和新的托管架构索引了一个内部网站。我使用“text_en”和“text_en_splitting”索引了页面标题,网址和正文。我得到了我想要的行为,除非查询字符串包含下划线。

我的用例如下:假设我们有3个术语,“第一个”,“第二个”和“第三个”,并且“第二个”在索引中不存在但“第一个”和“第三个”不存在。当搜索词是“第一个第二个第三个”时,我得到了我想要的行为(即返回带有“第一个”和“第三个”的页面。)

然而,当搜索词是“first_second_third”时,我得到0结果,但我希望得到一些东西,因为索引中存在“第一”和“第三”。

我正在使用edismax搜索qf = url_txt_en title_txt_en title_txt_en_split text_txt_en_split

有人可以建议一种方法来调整我的配置以获得我想要的东西吗?

3 个答案:

答案 0 :(得分:1)

您使用的是Solr示例附带的text_en_splitting定义吗?

如果是这样,问题是此类型使用WhitespaceTokenizerFactory,它通过在空格上拆分来创建标记。它将忽略下划线。

相反,听起来你需要在空格和下划线上进行标记。因此,请尝试将其替换为PatternTokenizerFactory,如下所示:

<tokenizer class="solr.PatternTokenizerFactory" pattern="_\s*" />

不要忘记在索引和查询分析器块中更改它。

答案 1 :(得分:0)

尝试使用WordDelimiterFilterFactory的以下字段类型。它将单词拆分为子词,并对子词组执行可选的转换。

默认情况下,单词会按照以下规则拆分为子词:

1.split on intra-word delimiters(所有非字母数字字符)。    “Wi-Fi” - &gt; “Wi”,“Fi”

2.split on case transition(可以关闭 - 请参阅splitOnCaseChange参数)    “PowerShot” - &gt; “权力”,“射击”

3.split on letter-number transition(可以关闭 - 请参阅splitOnNumerics参数)    “SD500” - &gt; “SD”,“500”

<fieldtype name="subword" class="solr.TextField">
      <analyzer type="query">
          <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          <filter class="solr.WordDelimiterFilterFactory"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="0"
                catenateNumbers="0"
                catenateAll="0"
                preserveOriginal="1"
                />
          <filter class="solr.LowerCaseFilterFactory"/>
          <filter class="solr.StopFilterFactory"/>
          <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
      <analyzer type="index">
          <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          <filter class="solr.WordDelimiterFilterFactory"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="1"
                catenateNumbers="1"
                catenateAll="0"
                preserveOriginal="1"
                />
          <filter class="solr.LowerCaseFilterFactory"/>
          <filter class="solr.StopFilterFactory"/>
          <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
    </fieldtype>

答案 2 :(得分:0)

您可以使用Tokenizer标记的任何非字母数字字符转换_。在下面的例子中,我把它转换为连字符' - ',它是StandardTokenizerFactory的有效分隔符

<charFilter class="solr.PatternReplaceCharFilterFactory" 
                    pattern="_" 
                    replacement="-"/>
      <tokenizer class="solr.StandardTokenizerFactory"/>