【发布时间】:2016-09-08 20:04:04
【问题描述】:
我正在使用 Solr 5.5,我有问题希望在这里找到解决方案。
我有一个使用以下设置创建的字段:
<field name="exactName_noAlias_en_US" type="text_exact_query_tokenized" indexed="true" stored="false"/>
<fieldtype name="text_exact_query_tokenized" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="10"/>
</analyzer>
</fieldtype>
该字段的值可以是:“Justin Bieber”
而我的期望如下:
对于“艺术家贾斯汀·比伯是青少年万人迷”的查询,我希望它与此文档相匹配。像“一位名叫 Bieber Justin 的艺术家是加拿大人”或“Justin 这个名字很常见”这样的查询不应该找到匹配项。
我发现当我发出查询“Justin Bieber”时,使用默认的“/select”请求处理程序找不到匹配项,即使它是完全匹配的。但是一个不同的字段被设置为 '/select' RH 的默认字段,因此,我尝试使用以下 curl 创建另一个 RH:
curl http://localhost/solr/performer/config -H 'Content-type:application/json' -d '{"add-requesthandler" : {"name": "/exactName","class":"solr.SearchHandler","defaults":{ "echoParams":"explicit" ,"rows":10, "df":"exactName_noAlias_en_US", "q.op":"AND" },"useParams":"x"}}'
它创建了我想要的 RH,但我的查询仍然与所需的文档不匹配。
请提出解决此问题的方法。
Here is a screenshot from the Analysis screen.
下面是查询响应的“调试”部分的 sn-p:“/exactName?q=exactName_noAlias_en_US:Justin%20Bieber&wt=json&indent=true&debug=true”
"debug":{
"rawquerystring":"exactName_noAlias_en_US:Justin Bieber",
"querystring":"exactName_noAlias_en_US:Justin Bieber",
"parsedquery":"+exactName_noAlias_en_US:justin +exactName_noAlias_en_US:bieber",
"parsedquery_toString":"+exactName_noAlias_en_US:justin +exactName_noAlias_en_US:bieber",
"explain":{},
下面是查询响应的“调试”部分的 sn-p:“/select?q=exactName_noAlias_en_US:Justin%20Bieber&wt=json&indent=true&debug=true”
"debug":{
"rawquerystring":"exactName_noAlias_en_US:Justin Bieber",
"querystring":"exactName_noAlias_en_US:Justin Bieber",
"parsedquery":"+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber",
"parsedquery_toString":"+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber",
"explain":{},
下面是使用 /select RH 的短语查询响应的“调试”部分的 sn-p:“/select?q=exactName_noAlias_en_US:"Justin%20Bieber"&wt=json&indent=true&debug=true
"debug":{
"rawquerystring":"exactName_noAlias_en_US:\"Justin Bieber\"",
"querystring":"exactName_noAlias_en_US:\"Justin Bieber\"",
"parsedquery":"MultiPhraseQuery(exactName_noAlias_en_US:\"(justin justin bieber) bieber\")",
"parsedquery_toString":"exactName_noAlias_en_US:\"(justin justin bieber) bieber\"",
"explain":{},
下面是使用 /exactName RH 的短语查询的响应的“调试”部分的 sn-p:“/exactName?q=exactName_noAlias_en_US:"Justin%20Bieber"&wt=json&indent=true&debug=true
"debug":{
"rawquerystring":"exactName_noAlias_en_US:\"Justin Bieber\"",
"querystring":"exactName_noAlias_en_US:\"Justin Bieber\"",
"parsedquery":"MultiPhraseQuery(exactName_noAlias_en_US:\"(justin justin bieber) bieber\")",
"parsedquery_toString":"exactName_noAlias_en_US:\"(justin justin bieber) bieber\"",
"explain":{},
下面是查询和相应的调试部分,查询中的空格已转义:
select?q=Justin\ Beiber&df=exactName_noAlias_en_US
调试:
"rawquerystring":"Justin\\ Beiber",
"querystring":"Justin\\ Beiber",
"parsedquery":"+((exactName_noAlias_en_US:justin exactName_noAlias_en_US:justin beiber)/no_coord) +exactName_noAlias_en_US:beiber",
"parsedquery_toString":"+(exactName_noAlias_en_US:justin exactName_noAlias_en_US:justin beiber) +exactName_noAlias_en_US:beiber",
"explain":{},
【问题讨论】:
-
您是否查看过管理页面下的“分析”页面下的输出?这将允许您输入索引内容和查询,并查看双方生成了哪些标记,以及双方是否得到相同的标记。对于调试,在 URL 中提供默认字段或查询字段通常比更改或添加请求处理程序更容易。
-
是的,我做到了。我在那个工具中看到了我想要的东西。但是,当我使用 /select RH 或我上面提到的自定义 '/exactName' 通过 http 发出查询时,我没有看到相同的行为。
-
能否将分析阶段的输出包括在内?还要记住,对分析器索引部分的任何更改都需要重新索引该文档。
-
@MatsLindh,我包含了示例查询分析的屏幕截图。是的,我在进行配置更改后重新索引了我的收藏。
标签: solr tokenize exact-match shingles