1

だから私が達成しようとしているのは、インデックスごとにカスタマイズされた検索可能なフィールドとの部分的な一致です。検索する値でを生成し、match_phrase_prefixそれが複数の単語である場合は、単語ごとに別の を生成します ( を使用できますprefixが、バグがあるか、設定が文書化されていません)。

この場合、私は"belden cable";を検索しようとしています。クエリは次のようになります。

{
    "query":{
        "bool":{
            "should":
            [
                {
                    "indices":{
                        "indices":["addresss"],
                        "query":{
                            "bool":{
                                "should":
                                [
                                    {"match_phrase_prefix":{"name":"BELDEN CABLE"}}
                                    {"match_phrase_prefix":{"name":"BELDEN"}},
                                    {"match_phrase_prefix":{"name":"CABLE"}}
                                ]
                            }
                        },
                        "no_match_query":"none"
                    }
                },
                {
                    "indices":{
                        "indices":["customers"],
                        "query":{
                            "bool":{
                                "should":[
                                    {"match_phrase_prefix":{"_all":"BELDEN CABLE"}},
                                    {"match_phrase_prefix":{"_all":"CABLE"}},
                                    {"match_phrase_prefix":{"_all":"BELDEN"}}
                                ]
                            }
                        },
                    "no_match_query":"none"
                }
            }
        ]
    }
}

私のターゲット検索は、"belden cable"最初にある結果を取得し、次に"belden"orのみを検索すること"cable"です。

これは (例によって) を含む 4 つ"belden cable"の結果、次に のみを含む結果"cable"、さらにの結果を返します"belden cable"

検索の完全な価値を持つ結果を後押しするにはどうすればよいですか?("belden cable")

単語と分離された単語の両方のインデックスクエリを分離しようとしましたが、関連性が最悪の結果が得られます。

match_phrase_prefixまた、結果を変更せずにfor内で boost ステートメントを使用してみまし"belden cable"た..

4

1 に答える 1

1

実際に必要なのは、入力データを分析する別の方法です。最終的なソリューションの出発点となる以下の内容を参照してください (クエリとデータ分析の要件の完全なセットを考慮する必要があるため)。ES を使用した検索は、クエリに関するものだけでなく、データの構造化と準備に関するものでもあります。

belden cableアイデアは、データを分析してそのままにしておきたいということです。"name": {"type": "string"}アナライザーのマッピングstandardが使用されているため、インデックス内の用語のリストはbeldencableです。実際に必要なのは [ belden cablebeldencable] です。そこで、shinglesトークンフィルターの提案を考えました。

DELETE /addresss
PUT /addresss
{
  "settings": {
    "analysis": {
      "analyzer": {
        "analyzer_shingle": {
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "shingle"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "analyzer_shingle"
        }
      }
    }
  }
}
DELETE /customers
PUT /customers
{
  "settings": {
    "analysis": {
      "analyzer": {
        "analyzer_shingle": {
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "shingle"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "_all": {
        "analyzer": "analyzer_shingle"
      }
    }
  }
}

POST /addresss/test/_bulk
{"index":{}}
{"name": "belden cable"}
{"index":{}}
{"name": "belden cable yyy"}
{"index":{}}
{"name": "belden cable xxx"}
{"index":{}}
{"name": "belden bla"}
{"index":{}}
{"name": "cable bla"}

POST /customers/test/_bulk
{"index":{}}
{"field1": "belden", "field2": "cable"}
{"index":{}}
{"field1": "belden cable yyy"}
{"index":{}}
{"field2": "belden cable xxx"}
{"index":{}}
{"field2": "belden bla"}
{"index":{}}
{"field2": "cable bla"}

GET /addresss,customers/test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "indices": {
            "indices": [
              "addresss"
            ],
            "query": {
              "bool": {
                "should": [
                  {
                    "match_phrase_prefix": {
                      "name": "BELDEN CABLE"
                    }
                  },
                  {
                    "match_phrase_prefix": {
                      "name": "BELDEN"
                    }
                  },
                  {
                    "match_phrase_prefix": {
                      "name": "CABLE"
                    }
                  }
                ]
              }
            },
            "no_match_query": "none"
          }
        },
        {
          "indices": {
            "indices": [
              "customers"
            ],
            "query": {
              "bool": {
                "should": [
                  {
                    "match_phrase_prefix": {
                      "_all": "BELDEN CABLE"
                    }
                  },
                  {
                    "match_phrase_prefix": {
                      "_all": "CABLE"
                    }
                  },
                  {
                    "match_phrase_prefix": {
                      "_all": "BELDEN"
                    }
                  }
                ]
              }
            },
            "no_match_query": "none"
          }
        }
      ]
    }
  }
}
于 2016-05-13T17:19:47.340 に答える