Solr 索引时间分词器/过滤器未按预期工作?
Solr index-time tokenizer / filter not working as expected?
我正在使用我公司之前设置的 solr 实例,但它似乎设置不正确。我可以搜索类似 q=*Paper*
的内容来获得结果,但不能搜索 paper
.
索引时间分词器/过滤器似乎没有像我预期的那样工作。
schema.xml
设置为标记化,然后在不区分大小写的情况下对该描述字段进行索引和查询,例如:
<field name="S_DSC" type="string_search" indexed="false" stored="true" required="false"/>
...etc...
<fieldType name="string_search" class="solr.TextField">
<analyzer type="index">
<!--Split at whitespaces and at punctuations. Strip other special characters.-->
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<!--Plural words handling. 'dogs'='dog'. Stemming not recommended. dry 'erase' board is not the same as dry board 'eraser'-->
<filter class="solr.EnglishMinimalStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
</analyzer>
</fieldType>
并且 solrconfig.xml
的默认 qf
设置为:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="spellcheck">false</str>
<str name="spellcheck.dictionary">default</str>
<str name="spellcheck.dictionary">wordbreak</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.extendedResults">false</str>
<str name="spellcheck.collate">true</str>
<str name="spellcheck.count">3</str>
<str name="spellcheck.maxCollations">1</str>
<str name="spellcheck.maxCollationTries">10</str>
<str name="defType">synonym_edismax</str>
<str name="synonyms">false</str>
<str name="qf">C_PN^20.0 PN^15.0 C_S_DSC^10.0 S_DSC^10.0 M_PN^5.0 DIM_NM^2.0 BRD^2.0 combined_search^1</str>
<str name="a">{!type=synonym_edismax qf=$qf v=$q}</str>
</lst>
当我查询 q=*
时,我得到了结果
select?q=*&rows=10&start=0&wt=json
"docs": [
{
"S_DSC": "Foo 8.5\" x 11\" Copy Paper, 20 lbs, 92 Brightness, 5000/Carton (123456)"
...etc...
},
但是如果我尝试搜索描述中的术语 (S_DSC),我不会得到结果,除非它区分大小写并且我在它周围加上了星号。
我得到 q=*Paper*
的结果
"parsedquery": "(+DisjunctionMaxQuery((combined_search:*paper* | PN:*Paper*^15.0 | S_DSC:*paper*^10.0 | C_PN:*Paper*^20.0 | BRD:*Paper*^2.0 | M_PN:*Paper*^5.0 | DIM_NM:*Paper*^2.0 | C_S_DSC:*paper*^10.0)))/no_coord",
q=paper
没有结果
"parsedquery": "(+DisjunctionMaxQuery((combined_search:paper | PN:paper^15.0 | S_DSC:paper^10.0 | C_PN:paper^20.0 | BRD:paper^2.0 | M_PN:paper^5.0 | DIM_NM:paper^2.0 | C_S_DSC:paper^10.0)))/no_coord",
q=Paper
没有结果
"parsedquery": "(+DisjunctionMaxQuery((combined_search:paper | PN:Paper^15.0 | S_DSC:paper^10.0 | C_PN:Paper^20.0 | BRD:Paper^2.0 | M_PN:Paper^5.0 | DIM_NM:Paper^2.0 | C_S_DSC:paper^10.0)))/no_coord",
不应该把上面的 S_DSC 标记化然后小写吗? (所以 paper
也在其中?)
我在这里错过了什么?感谢任何见解:)
您的 S_DSC
字段未编入索引:
<field name="S_DSC" type="string_search" --> indexed="false" <--
未编制索引的字段永远不会产生命中。我的猜测是您的点击来自其他未处理的索引字段之一,这就是为什么您会得到您所看到的行为。
当您将 debug=all
附加到您的查询时,每个找到的文档都会显示每个字段的词频匹配(即构成分数的因素),让您可以查看哪些字段产生了匹配。
我正在使用我公司之前设置的 solr 实例,但它似乎设置不正确。我可以搜索类似 q=*Paper*
的内容来获得结果,但不能搜索 paper
.
索引时间分词器/过滤器似乎没有像我预期的那样工作。
schema.xml
设置为标记化,然后在不区分大小写的情况下对该描述字段进行索引和查询,例如:
<field name="S_DSC" type="string_search" indexed="false" stored="true" required="false"/>
...etc...
<fieldType name="string_search" class="solr.TextField">
<analyzer type="index">
<!--Split at whitespaces and at punctuations. Strip other special characters.-->
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<!--Plural words handling. 'dogs'='dog'. Stemming not recommended. dry 'erase' board is not the same as dry board 'eraser'-->
<filter class="solr.EnglishMinimalStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
</analyzer>
</fieldType>
并且 solrconfig.xml
的默认 qf
设置为:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="spellcheck">false</str>
<str name="spellcheck.dictionary">default</str>
<str name="spellcheck.dictionary">wordbreak</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.extendedResults">false</str>
<str name="spellcheck.collate">true</str>
<str name="spellcheck.count">3</str>
<str name="spellcheck.maxCollations">1</str>
<str name="spellcheck.maxCollationTries">10</str>
<str name="defType">synonym_edismax</str>
<str name="synonyms">false</str>
<str name="qf">C_PN^20.0 PN^15.0 C_S_DSC^10.0 S_DSC^10.0 M_PN^5.0 DIM_NM^2.0 BRD^2.0 combined_search^1</str>
<str name="a">{!type=synonym_edismax qf=$qf v=$q}</str>
</lst>
当我查询 q=*
时,我得到了结果
select?q=*&rows=10&start=0&wt=json
"docs": [
{
"S_DSC": "Foo 8.5\" x 11\" Copy Paper, 20 lbs, 92 Brightness, 5000/Carton (123456)"
...etc...
},
但是如果我尝试搜索描述中的术语 (S_DSC),我不会得到结果,除非它区分大小写并且我在它周围加上了星号。
我得到 q=*Paper*
"parsedquery": "(+DisjunctionMaxQuery((combined_search:*paper* | PN:*Paper*^15.0 | S_DSC:*paper*^10.0 | C_PN:*Paper*^20.0 | BRD:*Paper*^2.0 | M_PN:*Paper*^5.0 | DIM_NM:*Paper*^2.0 | C_S_DSC:*paper*^10.0)))/no_coord",
q=paper
"parsedquery": "(+DisjunctionMaxQuery((combined_search:paper | PN:paper^15.0 | S_DSC:paper^10.0 | C_PN:paper^20.0 | BRD:paper^2.0 | M_PN:paper^5.0 | DIM_NM:paper^2.0 | C_S_DSC:paper^10.0)))/no_coord",
q=Paper
"parsedquery": "(+DisjunctionMaxQuery((combined_search:paper | PN:Paper^15.0 | S_DSC:paper^10.0 | C_PN:Paper^20.0 | BRD:Paper^2.0 | M_PN:Paper^5.0 | DIM_NM:Paper^2.0 | C_S_DSC:paper^10.0)))/no_coord",
不应该把上面的 S_DSC 标记化然后小写吗? (所以 paper
也在其中?)
我在这里错过了什么?感谢任何见解:)
您的 S_DSC
字段未编入索引:
<field name="S_DSC" type="string_search" --> indexed="false" <--
未编制索引的字段永远不会产生命中。我的猜测是您的点击来自其他未处理的索引字段之一,这就是为什么您会得到您所看到的行为。
当您将 debug=all
附加到您的查询时,每个找到的文档都会显示每个字段的词频匹配(即构成分数的因素),让您可以查看哪些字段产生了匹配。