solr shingle查询匹配关键字标记化字段

时间:2016-09-08 20:04:05

标签: solr tokenize exact-match shingles

我使用的是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>

此字段可以具有以下价值:&#34; Justin Bieber&#34;

我的期望如下:

对于查询&#34;艺术家贾斯汀比伯是一个青少年的万人迷&#34;,我希望它能匹配这份文件。像#34;一个名叫Bieber Justin的艺术家的问题是加拿大人和#34;或者&#34;贾斯汀这个名字很常见&#34;不应该找到匹配。

我看到使用默认的&#39; / select&#39;请求处理程序在我发出查询时找不到匹配项#8; Justin Bieber&#34;即使它完全匹配。但是,另一个字段被设置为&#39; / select&#39;的默认字段。 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.

以下是&#39;调试&#39;的一小段内容。查询响应部分:&#34; / exactName?q = exactName_noAlias_en_US:Justin%20Bieber&amp; wt = json&amp; indent = true&amp; debug = true&#34;

"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":{},

以下是&#39;调试&#39;的片段。查询响应部分:&#34; / select?q = exactName_noAlias_en_US:Justin%20Bieber&amp; wt = json&amp; indent = true&amp; debug = true&#34;

"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":{},

以下是&#39;调试&#39;的片段。使用/ select RH查询短语的响应部分:&#34; / select?q = exactName_noAlias_en_US:&#34; Justin%20Bieber&#34;&amp; wt = json&amp; indent = true&amp; 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":{},

以下是&#39;调试&#39;的片段。短语查询的响应部分使用/ exactName RH:&#34; / exactName?q = exactName_noAlias_en_US:&#34; Justin%20Bieber&#34;&amp; wt = json&amp; indent = true&amp; 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":{},

2 个答案:

答案 0 :(得分:0)

最后一个条目的解析查询调试信息显示您正在两个不同的字段中搜索 - 一个是您提供的字段,另一个是您之前设置的默认搜索字段。因为在每个字段中都没有包含您正在搜索的内容的单个标记,所以您不会受到影响。这也是您的分析显示命中的原因,但您在搜索时没有受到影响 - 实际查询与您为分析页面提供的查询不同。

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

第一个条目显示您正在搜索两个令牌,然后请求这两组文档的交集 - 因为它们都不包含该单个令牌,您不会受到影响。

搜索exactName_noAlias_en_US:"Justin Bieber"可能会为您提供所需的答案。

答案 1 :(得分:0)

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

  • q = exactName_noAlias_en_US :( Justin \ Bieber)
  • q = Justin \ Bieber&amp; df = exactName_noAlias_en_US
  • q = Justin \ Bieber(如果您在处理程序中定义了df)

很少有其他说明:

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