2016-09-05 5 views
1

複数のインデックスにまたがる一般的な検索クエリがあります。インデックスの中にはis_publishedというフィールドがあり、一部にdate_reviewというフィールドがあり、両方にそのフィールドがあります。Elasticsearch:複数のインデックスに存在するフィールドを条件付きでフィルタリングする

フィールドを検索し、上記のフィールドにフィルタをかけるクエリを作成するのには苦労しています。が存在するのは、です。 missingおよび/またはexistsを使用して個々のフィールドで必要なものを達成することができましたが、他のバリアントは除外されています。

  1. is_publishedが真であるORフィールドが
  2. date_review将来的にはORフィールドが
存在しない存在しません:英語で

は、私は結果で文書を保存しておきたいです

したがって、文書にis_publishedがあり、偽の場合は削除します。過去に文書にdate_reviewがある場合は、削除します。将来、is_published == falsedate_reviewがある場合は削除してください。

これは意味があると思いますか?答えるの目的のために

、文書は次のようになりますと仮定します。現時点では

// Has `is_published` flag 
{ 
    "label": "My document", 
    "body": "Lorem ipsum doler et sum.", 
    "is_published": true 
} 

// Has `date_review` flag 
{ 
    "label": "My document", 
    "body": "Lorem ipsum doler et sum.", 
    "date_review": "2017-01-01" 
} 


// Has both `is_published` and `date_review` flags 
{ 
    "label": "My document", 
    "body": "Lorem ipsum doler et sum.", 
    "is_published": true 
    "date_review": "2017-01-01" 
} 

、私の[フィルタリングされていない]クエリは次のようになります。

{ 
    "index": "index-1,index-2,index-3", 
    "type": "item", 
    "body": { 
    "query": { 
     "filtered": { 
     "query": { 
      "multi_match": { 
      "query": "my serach phrase", 
      "type": "phrase_prefix", 
      "fuzziness": null, 
      "fields": [ 
       "label^3", 
       "body", 
      ] 
      } 
     }, 
     "filter": [] 
     } 
    } 
    } 
} 

任意のポインタのために非常に感謝して。

ありがとうございました。

+0

あなたが行方不明/クエリ居住が存在する示しすることはできますか? – Val

+0

私はそれらを誤解していると思います。実際には、[クエリ]をもう一度見直してください。私は本当にESのクエリ言語で混乱してしまいます! – HelloPablo

+0

心配する必要はありません。すべてのインデックスが同じマッピングタイプですか? – Val

答えて

1

あなたはこのようなクエリを試すことができます。

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "multi_match": { 
      "query": "my serach phrase", 
      "type": "phrase_prefix", 
      "fuzziness": null, 
      "fields": [ 
      "label^3", 
      "body" 
      ] 
     } 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "bool": { 
       "minimum_should_match": 1, 
       "should": [ 
        { 
        "missing": { 
         "field": "is_published" 
        } 
        }, 
        { 
        "term": { 
         "is_published": true 
        } 
        } 
       ] 
       } 
      }, 
      { 
       "bool": { 
       "minimum_should_match": 1, 
       "should": [ 
        { 
        "missing": { 
         "field": "date_review" 
        } 
        }, 
        { 
        "range": { 
         "date_review": { 
         "gt": "now" 
         } 
        } 
        } 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

これはそれです!ありがとうございました。それは動作し、クエリの構築方法をよりよく理解しています。 – HelloPablo

関連する問題