【问题标题】:solr shingle query matching keyword tokenized fieldsolr shingle 查询匹配关键字标记化字段
【发布时间】: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


【解决方案1】:

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

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

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

搜索exactName_noAlias_en_US:"Justin Bieber" 可能会给您想要的答案。

【讨论】:

  • 我试过了,但还是没有运气。我已在原始消息中包含此类查询的调试部分。
【解决方案2】:

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

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

一些补充说明:

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

【讨论】:

  • 感谢@earnau 的回复。恐怕它仍然没有按我期望的方式工作。我在原始消息中包含了调试部分和查询。
  • 是的 - OR 是默认运算符,所以忘了说它必须设置才能工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2018-03-08
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
相关资源
最近更新 更多