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>

このフィールドには、「ジャスティン ビーバー」のような値を指定できます。

そして、私の期待は次のとおりです。

「The artist Justin Bieber is a teen heartthrob」というクエリの場合、このドキュメントと一致させたいと思います。また、「ビーバー ジャスティンという名前のアーティストはカナダ人です」や「ジャスティンという名前はとても一般的です」などのクエリでは、一致が見つからないはずです。

デフォルトの「/select」リクエスト ハンドラを使用すると、「Justin Bieber」というクエリを発行すると、完全に一致するにもかかわらず、一致が見つからないことがわかります。しかし、別のフィールドが '/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":{},

以下は、クエリに対する応答の「デバッグ」セクションのスニペットです。

"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 を使用したフレーズ クエリに対する応答の「デバッグ」セクションのスニペットです。

"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 を使用したフレーズ クエリに対する応答の「デバッグ」セクションのスニペットです。

"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 に答える