2

誰かがこれを行う方法の例を投稿できれば、Elasticsearch でフィルタリングがどのように機能するかについて私が持っていたほぼすべての質問に答えることができます。

A、B、C、D、E などはフィールドであり、a1、a2、…、b1、b2、…などはこれらのフィールドの可能な値であるとします。また、これらのフィールドのいずれかが複数の値を持つ可能性があると仮定します。

以下のロジックでフィルタリングを実行するにはどうすればよいですか。

A=a1 AND (B=b1 OR C=c1) AND ((D=d1) OR (D=d2)) AND (((E=e1) OR (E=e2)) AND (F=f1)) OR (((G=g1) AND (G=g2)) AND (H=h1))

これは私が書き込もうとしている実際のクエリではありませんが、書きたいすべてのクエリが含まれています。

A=a1 および (B=b1 または B=b2) の実行方法を知っています。たとえば、次の例では、CustomerID=113 AND (TypeID=91 OR TypeID=70) のドキュメントで "something to search" という用語を検索します。

{
   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "something to search"
        }
      },
      "filter": {
        "and": [
          {
            "term": {
              "CustomerID": "113"
            }
          },
          {
            "or": [
              {
                "terms": {
                  "TypeID": [
                    91,
                    70
                  ]
                }
              }
            ]
          }
        ]
      }
    }
  }
}

ただし、これらのフィルターの残りの部分を組み合わせる方法を理解するのに苦労しています。

完全な例は素晴らしいでしょう!

4

2 に答える 2

2

進むべき道は、基本的にスニペットで示したものです。AND フィルターOR フィルターを入れ子にして使用します。たとえば、次のことを考慮してくださいA=a1 AND (B=b1 OR C=c1)。次のようになります。

{
   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "something to search"
        }
      },
      "filter": {
        "and": [
          {
            "term": { "A": "a1" }
          },
          {
            "or": [
              {
                "term": { "B": "b1 }
              },
              {
                "term": { "C": "c1 }
              }
            ]
          }
        ]
      }
    }
  }
}

これらの JSON はプログラムで構築していると想定しているため、複雑なロジックがあれば、JSON で同等のフィルターを構築することは難しくありません。

問題が入力テキスト クエリのようなロジックのメモリ内の対応する表現に変換する方法である場合は、クエリでクエリ フィルター"A=a1 AND (B=b1 OR C=c1)"使用するだけの方がよいでしょう。おそらく、手動でロジックを解析したくないでしょう。query_string

于 2013-05-03T23:59:46.673 に答える
1

OR フィルターには、1 つが一致する必要がある 2 つ以上のサブクエリが含まれています。And フィルターには、すべてが一致する必要がある 2 つ以上のサブクエリが含まれています。それらを組み合わせてネストすると、多くの可能性が得られます。

あなたが求めるものを達成するには: A=a1 AND (B=b1 OR C=c1) AND ((D=d1) OR (D=d2)) AND (((E=e1) OR (E=e2)) AND (F=f1)) OR (((G=g1) AND (G=g2)) AND (H=h1))

{
   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "something to search"
        }
      },
      "filter": {
        "and": [
          {
            "term": {
              "A": "a1"
            }
          },
          {
            "or": [
              {
                "term": {
                  "B": "b1"
                }
              }, {
                "term": {
                  "C": "c1"
                }
              }
            ]
          },
          {
            "terms": 
              {
                "D": [ "d1", "d2" ]
              }
          },
          {
            "terms": 
              {
                "E": [ "e1", "e2" ]
              }
          },
          {
            "or": [
              {
                "term": {
                  "F": "f1"
                }
              }, {
                "term": {
                  "G": "g1"
                }
              }
            ]
          },
          {
            "term": 
              {
                "G": "g2"
              }
          },
          {
            "term": 
              {
                "H": "h1"
              }
          }
        ]
      }
    }
  }
}

私はparantecesを正しく数えましたが、うまくいけば写真を見ることができます.

于 2013-05-04T10:46:36.977 に答える