es: match_phrase短语匹配

一,问题的表现

当我们在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;

有多个以空格隔开的关键词时,可以拆分后使用多个match_phrase条件

posted @ 2024-10-09 19:03  刘宏缔的架构森林  阅读(271)  评论(0编辑  收藏  举报