2016-09-08 10 views
0

私はSolr 5.5を使用していますが、私はここで解決策を見つけることを望んでいるという問題があります。solr shingleクエリに一致するトークン化されたフィールド

私は、以下の設定を使用して作成したフィールドを持っている:

<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のアーティストは10代の恋人」という質問に対して、この文書と一致するようにしたいと思います。 「Bieber Justinというアーティストはカナダ人です」や「Justinという名前はとても一般的です」などの検索クエリは一致するものではありません。

デフォルトの '/ select'リクエストハンドラを使用すると、完全に一致していても「Justin Bieber」というクエリを発行したときに一致するものが見つかりません。しかし、別のフィールドは、RHを「/選択」のデフォルトのフィールドとして設定されているので、私はカールの下に使用して別の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"}}' 

それは私が望んでいたが、私のクエリはまだdidnのRHを作成しました必要な文書に一致する。

この問題の解決方法をお勧めします。以下は

Here is a screenshot from the Analysis screen.

クエリに対する応答の 'デバッグ' セクションの抜粋です: "/ exactName Q = exactName_noAlias_en_US:?ジャスティン%20Bieber &重量= JSON &インデント=真&デバッグ= 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":{}, 

以下クエリに対する応答の 'デバッグ' セクションの抜粋です: "/選択Q = exactName_noAlias_en_US:?ジャスティン%20Bieber &重量= JSON &インデント=真&デバッグ= 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":{}, 

そして、以下が選択RH /とフレーズのクエリに対する応答の 'デバッグ' セクションの抜粋です: "?/選択Q = exactName_noAlias_en_US:" ジャスティン%20Bieber」&重量= JSON &インデント=真&デバッグ=真

"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:?" ジャスティン%20Bieber」&重量= 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":{}, 
+0

[管理]ページの[分析]ページの出力を確認しましたか?そうすれば、インデックス付きのコンテンツとクエリの両方を入力して、どちらのトークンが生成され、どちらが同じであるかを確認することができます。既定のフィールドを提供するデバッグや、URLのクエリフィールドは通常、要求ハンドラの変更や追加より簡単です。 – MatsLindh

+0

はい、しました。私はそのツールで欲しかったものを正確に見ています。しかし、上記の/ select RHまたはカスタムの '/ exactName'を使用してhttp経由でクエリを発行した場合、私は同じ動作をしません。 – oveflown

+0

分析ステージからの出力を含めることができますか?また、アナライザのインデックス部分を変更するには、そのドキュメントを再インデックスする必要があります。 – MatsLindh

答えて

0

最後のエントリのためのparsedqueryデバッグ情報があることを示し2つの異なるフィールドで検索しています.1つは入力したフィールドで、もう1つは以前に設定したデフォルトの検索フィールドです。いずれのフィールドでも検索しているコンテンツには単一のトークンしかないので、ヒットしません。これは分析結果にヒットが表示される理由もありますが、検索中にヒットすることはありません。実際のクエリは分析ページに指定したものと同じではありません。

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

最初のエントリは、文書のこれら二組の交点を要求し、その後、あなたは2つのトークンを探していることを示して - 単一のトークンは、あなたがヒットを取得しないことを含んでいないどちらと。

exactName_noAlias_en_US:"Justin Bieber"を検索すると、探している回答が得られるかもしれません。

+0

私はそれを試みましたが、まだ運がありません。このようなクエリのデバッグセクションを元のメッセージに含めました。 – oveflown

0

シングルを使用するには、パーサーがクエリを解析し、スペースがあるところでデフォルトの演算子を適用しないようにする必要があります。それはスペースをエスケープすることで行うことができます。 可能なクエリは、次のとおりです。

  • Q = exactName_noAlias_en_US:(ジャスティン\ビーバー)
  • Q =ジャスティン\ビーバー& DF = exactName_noAlias_en_US
  • Q =ジャスティン\ビーバー(あなたのハンドラ内で定義されたdfしている場合)

いくつかの追加の注意事項:

  • Fiの内の不一致がありますフィールド名 'exactMatch'を定義し、 'exactName_noAlias_en_US'というクエリを定義します。
  • dfを上書きするために新しいクエリハンドラは必要ありません。クエリ内でこれを指定できます。
  • 明示的にフィールド名を指定する場合は、dfは不要です
+0

お返事ありがとうございます。私はそれがまだ私がそれを期待する方法で動作していないことが恐れている。 私は、デバッグ部分とクエリを元のメッセージに含めます。 – oveflown

+0

クエリに 'q.op = OR'を追加すると、そのトリックが実行されました。ありがとう@earnau – oveflown

+0

はい - または既定の演算子ですので、動作するように設定する必要があることを忘れていました。 – earnau

関連する問題