2017-04-19 20 views
0

私は弾性検索エンジン5.3製品を持っています。 各製品には14桁の製品コードがあり、以下のルールで検索する必要があります。完全なコードは、最後の9桁、最後の6桁、最後の5桁または最後の4桁のみの検索語句と一致する必要があります。カスタムアナライザーでelasticsearchのmulti_match cross_fieldsクエリの結果を取得

これを達成するために、パターンキャプチャトークンフィルタを使用してインデックス時に適切なトークンを作成するカスタムアナライザを作成しました。これは正しく動作しているようです。 _analyse APIは、正しい用語が作成されたことを示します。

弾性検索からドキュメントをフェッチするには、複数のフィールドを同時に検索するためにcross_fields bool multi_matchを使用しています。

製品コードと一致する部分と他の項目と一致する部分を持つクエリ文字列がある場合、結果は返されませんが、各部分を個別に検索すると適切な結果が返されます。また、製品コード以外のフィールドに複数の部品がある場合、正しい結果が返されます。

マイmapingとアナライザー:

PUT /store 
{ 
    "mappings": { 
     "products":{ 
      "properties":{ 
       "productCode":{ 
        "analyzer": "ProductCode", 
        "search_analyzer": "standard", 
        "type": "text" 
       }, 
       "description": { 
        "type": "text" 
       }, 
       "remarks": { 
        "type": "text" 
       } 
      } 
     } 
    }, 
    "settings": { 
     "analysis": { 
      "filter": { 
       "ProductCodeNGram": { 
        "type": "pattern_capture", 
        "preserve_original": "true", 
        "patterns": [ 
         "\\d{5}(\\d{9})", 
         "\\d{8}(\\d{6})", 
         "\\d{9}(\\d{5})", 
         "\\d{10}(\\d{4})" 
        ] 
       } 
      }, 
      "analyzer": { 
       "ProductCode": { 
        "filter": ["ProductCodeNGram"], 
        "type": "custom", 
        "preserve_original": "true", 
        "tokenizer": "standard" 
       } 
      } 
     } 
    } 
} 

クエリ

GET /store/products/_search 
{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "multi_match": { 
         "query": "[query_string]", 
         "fields": ["productCode", "description", "remarks"], 
         "type": "cross_fields", 
         "operator": "and" 
        } 
       } 
      ] 
     } 
    } 
} 

サンプル・データ

POST /store/products 
{ 
    "productCode": "999999123456789", 
    "description": "Foo bar", 
    "remarks": "Foobar" 
} 

follすべてのクエリ文字列が1つの結果を返します。

"456789"、 "foo"、 "foobar"、 "foo foobar"。

しかし、query_string "foo 456789"は結果を返しません。

最後の検索で結果が返されない理由は非常に興味があります。私はそれがすべきだと確信しています。

答えて

1

問題は、異なるアナライザーでフィールド上にcross_fieldsを実行していることです。クロスフィールドは、同じアナライザを使用するフィールドでのみ機能します。実際には、クロスフィールドを実行する前に分析器でフィールドをグループ化します。詳細については、このドキュメントを参照してください。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html#_literal_cross_field_literal_and_analysis

関連する問題