3

インデックスに次のようなドキュメントがあります。

{
  "field" : "a, b, c, d, e"
}

フィールド値は、配列から文字列への関数によって作成された文字列です。したがって、すべてのドキュメントが同じ文字列を持つわけではありませんが、すべてのドキュメントには少なくとも"a, b"as 値があります。

ここで、2 種類のドキュメントに一致するクエリが必要です。

フィールド値として(正確に) のみを持つドキュメント"a, b"、またはフィールドに少なくとも 2 つの検索語を含むドキュメント。

基本的に私の問題は、フィールドが分​​析されると最初の条件を満たせず、フィールドが分​​析されない場合は2番目の条件を満たさないことです。フィールドをnot_alanyzedとして複製しない解決策はありますか?

フィールドを分析されていないフィールド (コード例 field1) に複製すると、このクエリを使用できます。このクエリは達成するには複雑すぎるように感じます...:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "or": [
          {
            "term": {
              "field1": "a, b"
            }
          },
          {
            "and": [
              {
                "term": {
                  "field": "c"
                }
              },
              {
                "term": {
                  "field1": "d"
                }
              }
            ]
          }
        ]
      }
    }
  }
}
4

3 に答える 3

5

マルチフィールド マッピングを使用できます。これにより、フィールドを 1 回送信するだけで、2 つの異なる方法で分析できます。

"properties": {
  "field" {
    "type": "multi_field",
      "fields" : {
        "field" : {"type" : "string", "index" : "analyzed"},
        "raw" : {"type" : "string", "index" : "not_analyzed"}
    }
  }
}

ドキュメントを通常どおりelasticsearchに送信します(ドキュメントはfield(またはfield.field)とfield.raw

クエリは次のようになります。

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "or": [
          {
            "term": {
              "field.raw": "a, b"
            }
          },
          {
            "and": [
              {
                "term": {
                  "field": "c"
                }
              },
              {
                "term": {
                  "field": "d"
                }
              }
            ]
          }
        ]
      }
    }
  }
}

これは最もエレガントなソリューションではありません。データの保存方法を変更することをお勧めします。「a、b」は何か違うものを表しているようです。おそらく、ドキュメントにブール値フィールド「a_b_only」があり、フィルタリングする必要があります。

頑張ってください。さらにお気軽にお問い合わせください。

于 2013-07-24T12:03:15.640 に答える
3

multi_fields は、Elasticsearch バージョン 1.X ではサポートされていません。代わりに使用してください。

"title" :{ 
           "type" : "string",
            "raw" : {"type" :"string" , "index" :"not_analyzed" 
         }

詳細については、Elasticsearch 1.7 Docs on Multi-fields を参照してください。

于 2014-08-27T17:25:45.357 に答える