短语查询 Phrase Matching
PUT my_.index/_doc/1 { "names": [ "John Abraham", "Lincoln Smith"] } GET my_index/_search { "query": { "match_phrase" : { "names" : "Abraham" } } } GET my_index/_search { "query": { "match_phrase" : { "names" : { "query": "Abraham Lincoln", "slop": 101 } } } }
和match查询类似,match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索所有的词条,但只保留包含了所有搜索词条的文档,并且词条的位置要邻接。
位置信息被保存在倒排索引(Inverted Index)中,像match_phrase这样位置感知(Position-aware)的查询能够使用位置信息来匹配那些含有正确单词出现顺序的文档,且在这些单词之间没有插入别的单词。
短语是什么
对于匹配了短语"quick brown fox"的文档,下面的条件必须为true:
- quick、brown和fox必须全部出现在某个字段中。
- brown的位置必须比quick的位置大1。
- fox的位置必须比quick的位置大2。
如果以上的任何一个条件没有被满足,那么文档就不能被匹配
slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配。相隔多远的意思是,你需要移动一个词条多少次来让查询和文档匹配?
POST my_index/_analyze { "analyzer": "my_custom_analyzer", "text": [ "John Abraham", "Lincoln Smith"] } { "tokens": [ { "token": "john", "start_offset": 0, "end_offset": 4, "type": "word", "position": 0 }, { "token": "abraham", "start_offset": 5, "end_offset": 12, "type": "word", "position": 1 }, { "token": "lincoln", "start_offset": 13, "end_offset": 20, "type": "word", "position": 102 }, { "token": "smith", "start_offset": 21, "end_offset": 26, "type": "word", "position": 103 } ] }