【发布时间】:2021-03-28 04:32:36
【问题描述】:
我正在尝试来自 solr 的以下查询:
http://localhost:8393/solr/core-name/select?defType=edismax&fl=product_id_i,ProductName_ten&q=cnmg+432+ud32&q.op=AND&qf=ProductName_ten_ngram
在 Solr 5.2 上,我收到一份文档,其中包含以下结果:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
<lst name="params">
<str name="fl">product_id_i,ProductName_ten</str>
<str name="q">cnmg 432 ud32</str>
<str name="qf">ProductName_ten_ngram</str>
<str name="q.op">AND</str>
<str name="defType">edismax</str>
</lst>
</lst>
<result name="response" numFound="1" start="0">
<doc>
<int name="product_id_i">1521210</int>
<str name="ProductName_ten">
CNMG 432 ZM1 UD32, 1/32″ Corner Radius, 3/16″ Thick, 1/2″ Inscribed Circle, Turning Indexable Insert
</str>
</doc>
</result>
</response>
但是,在 Solr 8.2 上,找不到该文档,我得到以下结果:
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"cnmg 432 ud32",
"defType":"edismax",
"qf":"ProductName_ten_ngram",
"fl":"product_id_i,ProductName_ten",
"q.op":"AND"}},
"response":{"numFound":0,"start":0,"docs":[]
}}
两个系统的schema.xml文件基本相同,字段定义如下:
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
<field name="ProductName_ten_ngram" type="text_gen_text_only_ngram" indexed="true" stored="false" multiValued="false"/>
<dynamicField name="*_ten" type="text_en" indexed="true" stored="true" />
<fieldType name="text_gen_text_only_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="[^a-z0-9.\/]" replacement="" replace="all" />
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="2" outputUnigrams="true" outputUnigramsIfNoShingles="true" tokenSeparator="-"/>
<filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="[^a-z0-9.\/]" replacement="" replace="all" />
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="2" outputUnigrams="false" outputUnigramsIfNoShingles="true" tokenSeparator="-"/>
</analyzer>
</fieldType>
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<!-- Case insensitive stop word removal.
-->
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
<filter class="solr.EnglishMinimalStemFilterFactory"/>
-->
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedStopFilterFactory" managed="english" />
<filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
<filter class="solr.EnglishMinimalStemFilterFactory"/>
-->
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
<copyField source="ProductName_ten" dest="ProductName_ten_ngram"/>
问题是——为什么在 Solr 5.2 中返回的结果没有在 Solr 8.2 中返回?
【问题讨论】:
-
如果您查看 Solr 管理员下的字段,您是否看到了您期望的术语?如果您在该领域进行比赛,您会收到任何参赛作品吗?
-
如果我不是通过搜索查询,而是查询 fq=product_id_i: 1521210 那么我确实得到了带有 ProductName_ten 的 solr 文档:“CNMG 432 ZM1 UD32, 1/32″ Corner Radius, 3/16 ″ 厚 1/2″ 内切圆车削可转位刀片"
-
当然,但这并不能告诉我们有关
ProductName_ten_ngram的处理方式的任何信息。您的第一个查询已经显示该文档已按您的预期编入索引。但是,您的字段包含KeywordTokenizer并且没有发生 ngramming(您的链中没有任何 ngram 过滤器)。你期望会发生什么?据我所知,该字段中唯一索引的内容是单个长标记,其中包含该字段的完整文本。 -
我看到我在架构中遗漏了部分字段类型定义。编辑它。它确实在“索引”分析器下包含 ngram。
-
然后使用 Solr admin 下的 Analysis 页面并输入索引内容和您的查询,并查看生成的令牌不匹配的原因 - 词干可能是这里的问题之一。