数据:
POST /my_index/my_type/_bulk { "index": { "_id": 1 }} { "title": "The quick brown fox" } { "index": { "_id": 2 }} { "title": "The quick brown fox jumps over the lazy dog" } { "index": { "_id": 3 }} { "title": "The quick brown fox jumps over the quick dog" } { "index": { "_id": 4 }} { "title": "Brown fox brown dog" }
{ "index": { "_id": 6 }} { "title": "The quick brown big fox jumps over the quick dog" }
第一步:精确匹配,我们查询title为quick brown fox的记录
输入命令:
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
看结果我们可以得出_id=4和_id=6的记录没有被查出来
短语(phrase)是什么?
对于匹配了短语"quick brown fox"的文档,下面的条件必须为true:
- quick,brown和fox必须全部出现在某个字段中。
- brown的位置必须比quick的位置大1。
- fox的位置必须比quick的位置大2。
- 如果以上的任何条件没有被满足,那么文档就不能被匹配。
第二步:不精确匹配(混合匹配)
精确短语匹配也许太过于严格了。也许我们希望含有"quick brown fox"的文档也能够匹配"quick fox"查询,即使位置并不是完全相等的。
我们可以在短语匹配使用slop参数来引入一些灵活性:
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": {
"query": "quick fox",
"slop": 3
}
}
}
}
slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配。相隔多远的意思是,你需要移动一个词条多少次来让查询和文档匹配?