0

我正在使用 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,但我的查询仍然与所需的文档不匹配。

请提出解决此问题的方法。

这是分析屏幕的屏幕截图。

下面是查询响应的“调试”部分的片段:“/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":{},

以下是查询响应的“调试”部分的片段:“/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 的短语查询响应的“调试”部分的片段:“/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 的短语查询响应的“调试”部分的片段:“/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":{},
4

2 回答 2

0

为了使用带状疱疹,您必须防止解析器解析查询并在空格所在的位置应用默认运算符。这可以通过逃逸空间来完成。可能的查询是:

  • q=exactName_noAlias_en_US:(贾斯汀\比伯)
  • q=贾斯汀\比伯&df=exactName_noAlias_en_US
  • q=Justin\ Bieber(如果您在处理程序中定义了 df)

一些补充说明:

  • 字段命名存在差异 - 在您的配置中定义字段“exactMatch”,定义默认字段“exactName”并查询“exactName_noAlias_en_US”
  • 您不需要新的查询处理程序来覆盖 df - 您可以在查询中提供它
  • 如果您明确提供字段名称,则不需要 df
于 2016-09-16T09:43:42.257 回答
0

最后一个条目的 parsedquery 调试信息显示您在两个不同的字段中进行搜索 - 一个是您提供的字段,另一个是您之前设置的默认搜索字段。由于您在每个字段中搜索的内容都没有一个标记,因此您不会受到打击。这也是您的分析显示成功但您在搜索时没有获得成功的原因 - 实际查询与您为分析页面提供的查询不同。

+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber"
 ^^^^^^^^^^^^^^^^^^^^^^^         ^^^^^^^^^^^^^^^^^^^^

第一个条目显示您正在搜索两个标记,然后请求这两组文档的交集 - 因为两者都不包含该单个标记,所以您不会得到任何结果。

搜索exactName_noAlias_en_US:"Justin Bieber"可能会给你你正在寻找的答案。

于 2016-09-09T15:03:09.207 回答