2017-10-06 12 views
0

主な目的は、検索テキストを検索する必要があるクエリを作成することです。読み込みポートまたはアンロードポートのフィルタが適用されている場合は、検索テキストの結果からフィルタリングする必要があります。フィルタを使用したElasticsearch boolクエリ

フィルタが適用されていない場合は、さらに処理を進める必要があります。

例:ジーンズを検索し、フィルターを適用すると、ロードポートはインドで、アンロードポートはUSでなければなりません。

このレポートを作成しようとしましたが、適切な結果が得られていません。

{ 
"query": { 
    "bool": { 
     "should": [ 
     { 
      "bool": { 
      "must": [ 
       { 
       "query_string": { 
        "query": searchText 
       } 
       } 
      ] 
      } 
     }, 
     { 
      "terms": { 
      "loadingPort":loadingPortArray 
      } 
     }, 
     { 
      "terms": { 
      "unloadingPort":unloadingPortArray 
      } 
     } 
     ] 
    } 
    } 
} 
+0

[どのような状況下で、私はより速く答えを得るために、私の質問に、「緊急」または他の同様の句を追加できますか?]をお読みください(// meta.stackoverflow.com/q/326569) - 要約をこれはボランティアに対処する理想的な方法ではなく、おそらく回答を得ることに逆効果があるということです。これをあなたの質問に追加しないでください。 – halfer

答えて

0

あなたの問題は、あなたが持つすべての文がORロジックによって結合されることを意味し、すべての帖はshould内のフィルタを\ラップしていることです。 ANDが必要な場合は、must内の文を折り返す必要があります。

ところで、フィルタを使用していない、あなたはtermクエリを使用しています。 elasticsearchでは、クエリとフィルタの間に大きな違いがあります。フィルターを使用するには、フィルター付きのbool照会を使用する必要があります。

{ 
"query": { 
    "bool": { 
     "must": [ 
     { 
      "bool": { 
      "must": [ 
       { 
       "query_string": { 
        "query": searchText 
       } 
       } 
      ] 
      } 
     }   
     ], 
     "filter": { 
      "bool": { 
       "must": [ 
        { 
        "terms": { 
         "loadingPort":loadingPortArray 
        } 
        }, 
        { 
        "terms": { 
         "unloadingPort":loadingPortArray 
        } 
        } 
       ] 
      } 
     } 
    } 
    } 
} 
+0

ありがとうございます。しかし、私の主な問題は、ユーザーがフィルターを適用しない、つまりポート・アレイをロードしていてポート・アレイをアンロードすることが空である場合です。その場合、これはエラーを投げています。 – komal

+0

条件付きフィルタは適用できません。その代わりに、条件付きでクエリを作成し、それらが存在するかどうかをフィルタリングする必要があります。 –

+0

フィルタが適用されていないときにどのような条件を使用するべきか教えてください。 – komal

関連する問題