1

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

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

但是,当搜索词是“first_second_third”时,我得到 0 个结果,但我希望得到一些结果,因为索引中存在“first”和“third”。

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

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

4

3 回答 3

1

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

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

相反,听起来您需要同时标记空格和下划线。所以尝试用PatternTokenizerFactory替换它,如下所示:

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

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

于 2015-09-03T15:07:35.607 回答
0

您可以将 _ 转换为您的 Tokenizer 标记的任何非字母数字字符。在以下情况下,我将其转换为连字符“-”,这是 StandardTokenizerFactory 的有效分隔符

<charFilter class="solr.PatternReplaceCharFilterFactory" 
                    pattern="_" 
                    replacement="-"/>
      <tokenizer class="solr.StandardTokenizerFactory"/>
于 2016-06-27T22:57:52.440 回答
0

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

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

1.拆分字内分隔符(所有非字母数字字符)。“Wi-Fi” -> “Wi”、“Fi”

2.split on case transitions(可以关闭——见splitOnCaseChange参数)“PowerShot”->“Power”,“Shot”

3.split on letter-number transitions (可以关闭 - 见 splitOnNumerics 参数) "SD500" -> "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>
于 2015-09-03T23:56:43.853 回答