深入理解 Match Phrase Prefix Query

本贴最后更新于 2538 天前,其中的信息可能已经天翻地覆

Match Phrase Prefix Query

国内对于 Elasticsearch 深入的人并不多,或者大多数大牛不屑于分享关于 Elasticsearch 的知识,这里讲讲 Elasticsearch 中的 Constant Score Query

关于

概念

match_phrase_prefix与match_phrase相同,但是它多了一个特性,就是它允许在文本的最后一个词项(term)上的前缀匹配,如果
是一个单词,比如a,它会匹配文档字段所有以a开头的文档,如果是一个短语,比如 "this is ma" ,则它会先进行match_phrase查询,找出
所有包含短语"this is"的的文档,然后在这些匹配的文档中找出所有以"ma"为前缀的文档.

语法

POST /my_index/my_type/_search
{
  "query": {
    "match_phrase_prefix": {
      "title": {
        "query": "this is r",
          "analyzer": "standard",
          "max_expansions": 10,
          "slop":2,
          "boost":100
      }
    }
  }
}

参数说明

  • analyzer 指定何种分析器来对该短语进行分词处理
  • max_expansions 控制最大的返回结果
  • boost 用于设置该查询的权重
  • slop 允许短语间的词项(term)间隔

一般来说,match_phrase_prefix 可以实现比较粗糙的自动建议(Suggest).

Java API

@Test
    public void test() throws Exception {
        String key = "this is a";
        MatchPhrasePrefixQueryBuilder matchPhrasePrefixQueryBuilder = QueryBuilders.matchPhrasePrefixQuery("title",key);

        matchPhrasePrefixQueryBuilder.boost(10);
        matchPhrasePrefixQueryBuilder.analyzer("standard");
        matchPhrasePrefixQueryBuilder.slop(2);
        matchPhrasePrefixQueryBuilder.maxExpansions(100);

        SearchResponse searchResponse = client.prepareSearch()
                .setIndices("my_index")
                .setTypes("my_type")
                .setQuery(matchPhrasePrefixQueryBuilder)
                .execute()
                .actionGet();
        System.out.println(ResponseUtil.parse(searchResponse));
    }

更多关于 Java API,请参考:MatchPhrasePrefixQueryDemo

参考

  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 212 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    max_expansions 这个好像不是控制最大的返回结果

  • someone

    说真的,没有看出那点深入理解了。