2016-08-02 8 views
0

私のsolrに多値フィールドを持つドキュメントがあります。私はこれらの多値フィールドにしたがって検索したい。 質問したいとき。solr検索で複数の多値フィールドを使用する方法

http://localhost:8983/solr/demo/select?q=*:*&fq=id:FEAE38C2-ABFF-4F0C-8AFD-9B8F51036D8A 

次のクエリ結果が表示されます。

response": { 
    "numFound": 1, 
    "start": 0, 
    "docs": [ 
     { 
     "created_date": "2016-03-23T13:47:46.55Z", 
     "solr_index_date": "2016-04-01T08:21:59.78Z", 
     "TitleForUrl": "it-s-a-wonderful-life", 
     "modified_date": "2016-03-30T08:45:44.507Z",   
     "id": "FEAE38C2-ABFF-4F0C-8AFD-9B8F51036D8A",   
     "title": "It's a wonderful life",   
     "article": "An angel helps a compassionate but despairingly frustrated businessman by showing what life would have been like if he never exis", 
     "Cast": [ 
      "James Stewart", 
      "Donna Reed", 
      "Lionel Barrymore" 
     ], 
     "IsCastActive": [ 
      "false", 
      "true", 
      "true" 
     ] 
     } 
    ] 
    } 

「キャスト」と「IsCastActive」という名前の2つの不正なフィールドがあります。私はキャストのようにフィルタを追加すると 私の問題は、次のような「ジェームズ・スチュワート」AND IsCastActive =「true」を:

http://localhost:8983/solr/demo/select?q=*:*&fq=id:FEAE38C2-ABFF-4F0C-8AFD-9B8F51036D8A&fq=Cast:"James Stewart"&fq=IsCastActive:"true" 

のSolrはまだ同じ結果を与えるが、「ジェームズ・スチュワートは、」文書にアクティブではありません。だから、私はSolrが私の質問に合った文書に応答することを望んでいません。 私は何か間違っていると思います。それを行う正しい方法は何ですか?

+1

このようなマルチフィールドをフィルタリングすることはできません。 – Oyeme

+0

「文書内でアクティブではありません」とは、具体的にはどういう意味ですか?すでに** id **の一致を持つ単一の文書に検索を制限しています。残りの部分は絞り込みを繰り返すだけです。 –

答えて

1

ここでは、Solrではまっすぐ前向きに見えません。しかし、より効果的なのは、キャストメンバの名前をキーとして保持し、その値をtrueまたはfalseに関連付けてから、ユーザー名をキーとしてフィルタすることだと思います。このようなもの:James Stewart :["true"]キャスト名とコロンで区切られた彼/彼女の活動状態を格納する単一のフィールドを使用することができるかもしれません.。このようなものcastInfo:["James Stewart:false","John Sanders:true"]。あなたはそれに次のような何かでフィルタリングすることができますfq=castInfo:"James Stewart:false"

+0

親切にご意見をお寄せいただきありがとうございます。 solrは多値フィールドを連続して索引付けするため、順次照会する機能も必要です。そうではありませんか? –

+0

ええ、Solrでの私の経験では、2つのフィールドのインデックスをキーバリューファッションで追跡できるオプションはありません。それは言われていますが、私たちは上記のようなインデックスを私たちの要件に合わせて微調整するかもしれません。 –

0

問題の代替ソリューションを提案したいと思います。そのような解決策は、true/falseをpayloadsの整数として格納します。

<field name="cast" type="payloads" indexed="true" stored="true"/> 

<fieldtype name="payloads" stored="false" indexed="true" class="solr.TextField" > 
    <analyzer> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.DelimitedPayloadTokenFilterFactory" encoder="integer"/> 
    </analyzer> 
    <similarity class="payloadexample.PayloadSimilarityFactory" /> 
</fieldtype> 

コンテンツとして例えばインデックスを作成することができます:だからアイデアは、フィールドのようなスキーマで定義を持つキャストと呼ばれることです

ジェームズ・スチュワート| 0
ドナ・リード| 1

ここで、0/1は真/偽です。 ペイロードを使用すると、投稿リストから直接読んで、関連するクエリのパフォーマンスを向上させることもできます。 Here上記の説明を達成する方法の例を見つけることができます。

関連する問題