一,问题的表现
当我们在es的索引库中搜索 朝阳新城 时,搜索结果中有包含 朝阳新城 这四个字的结果,也有只包含朝阳或只包含新城的结果,
这是analyzer在对关键词做了分词之后从索引库中返回,
如果说:我只想要包含朝阳新城这四个字的结果,需要怎么做?
二,解决:
1,默认的match搜索会对搜索内容进行分词,比如:mill lane 会分成 mill 和 lane 之后搜索的结果可能包含仅有其中一项的结果,但是此类结果分数较低。
如果不希望被分词而是直接查询短语,可以使用 match_phrase 进行搜索
就像 match
查询对于标准全文检索是一种最常用的查询一样,
当你想找到彼此邻近搜索词的查询方法时,就会想到 match_phrase
查询
例子:
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
match_phrase
查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,
但只保留那些包含 全部 搜索词项,且 位置 与搜索词项相同的文档。
比如对于 quick fox
的短语搜索可能不会匹配到任何文档,因为没有文档包含的 quick
词之后紧跟着 fox
2,什么是短语匹配?
一个被认定为和短语 quick brown fox
匹配的文档,必须满足以下这些要求:
quick
、brown
和fox
需要全部出现在域中。brown
的位置应该比quick
的位置大1
。fox
的位置应该比quick
的位置大2
。
如果以上任何一个选项不成立,则该文档不能认定为匹配。
三,php中应用match_phrase
注意此处指定analyzer,因为是要与创建索引时使用的分词器保持一致,
避免导致结果不准确
info是要搜索的字段名
$key是用户输入的关键词
$infoWhere = ['match_phrase' => ['info' => ['query'=>$key,'analyzer' => 'ik_max_word']]];
$mustWhere[] = $infoWhere;
标签:短语,fox,搜索,match,quick,phrase,es From: https://www.cnblogs.com/architectforest/p/18454920