2016-12-21 7 views
3

私はElasticsearchを使ってすべてのフィールドを検索しますが、どのフィールドが一致しているか知っていますか?私はElasticsearchを使ってすべてのフィールドを検索しますが、どのフィールドが一致しているか知っていますか?

PUT my_index/user/1 
{ 
    "first_name": "John", 
    "last_name":  "Smith", 
    "date_of_birth": "1970-10-24" 
} 

GET my_index/_search 
{ 
    "query": { 
    "match": { 
     "_all": "john 1970" 
    } 
    } 
} 

上記の例では、すべてのフィールドについて「john 1970」が検索されています。 putドキュメントは "first_name"と "date_of_birth"と一致するため、結果として返します。

「first_name」と「date_of_birth」が一致することをどのように知ることができますか?

答えて

2

_allは、他のすべてのフィールドのすべての値がインデックス時にコピーされるフィールドです。具体的には、ときにインデックス概念的ES何あなたの文書は、見ていると、これは(ソースが_all_all自身を含むように改変されていないが、単にインデックス付け、保存されません)です:だから

{ 
    "first_name": "John", 
    "last_name":  "Smith", 
    "date_of_birth": "1970-10-24", 
    "_all": "john smith 1970 10 24" 
} 

あなたは_allに対して、次に一致した場合一致することができるフィールドは_allそのものです。どのフィールドに一致する値が含まれているかを「リバースエンジニアリング」する方法はありません。_allにのみ基づいています。

しかし、できることはハイライトという別の機能を使用することです。それに応答して

{ 
    "query": { 
    "match": { 
     "_all": "john 1970" 
    } 
    }, 
    "highlight": { 
    "fields": { 
     "*": { 
     "require_field_match": false 
     } 
    } 
    } 
} 

、あなたはそのfirst_nameを示しており、このようなものが表示されます:_allフィールドは、どの値が、元のフィールドの一致を強調表示することができますので、それが強調表示することはできませんが、他のフィールドはできる保存されていないので、クエリと一致します。

"highlight": { 
    "first_name": [ 
    "<em>John</em>" 
    ] 
} 
+1

ありがとうございました。非常に参考になりました。 最近、Elasticsearchが使用されているため、理解できないものがたくさんあります。 仕事は今日より早く終了するようです。 –

+0

私はそれが助けてうれしいです。 – Val

関連する問題