我使用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
有人可以建议一种方法来调整我的配置以获得我想要的东西吗?
答案 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"/>