ES基于completion suggest实现搜索提示

在这里插入图片描述

  • Term Suggester,基于编辑距离,对analyze过的单个term去提供建议,并不会考虑多个term/词组之间的关系。quert -> query
  • Phrase Suggester,在Term Suggester的基础上,通过ngram以词组为单位返回建议。noble prize -> nobel prize
  • Completion Suggester,FST数据结构,类似Trie树,不用打开倒排,快速返回,前缀匹配
  • Context Suggester,在Completion Suggester的基础上,用于filter和boost

下面说说在es中的种实现搜索提示的功能,基于completion suggest 进行实现,其在实际应用中搜索性能更加高效。

假如文档库里有一堆关于大话西游的,比如,“大话西游电影”,“大话西游小说”,"大话西游舞台剧"等,这里我们需要搜索以"大话西游"开头的文档。

1、自定义index,及字段分词属性,这里用IK中文分词器:

PUT /news_website
{
  "mappings": {
    "news" : {
      "properties" : {
        "title" : {
          "type": "text",
          "analyzer": "ik_max_word",
          "fields": {
            "suggest" : {
              "type" : "completion",
              "analyzer": "ik_max_word"
            }
          }
        },
        "content": {
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}

2、completion,es实现的时候,是非常高性能的,会构建不是倒排索引,也不是正拍索引,就是纯的用于进行前缀搜索的一种特殊的数据结构,而且会全部放在内存中,所以auto completion进行的前缀搜索提示,性能是非常高的,向索引插入几条数据:

PUT /news_website/news/1
{
  "title": "大话西游电影",
  "content": "大话西游的电影时隔20年即将在2017年4月重映"
}
PUT /news_website/news/2
{
  "title": "大话西游小说",
  "content": "某知名网络小说作家已经完成了大话西游同名小说的出版"
}
PUT /news_website/news/3
{
  "title": "大话西游手游",
  "content": "网易游戏近日出品了大话西游经典IP的手游,正在火爆内测中"
}
PUT /news_website/news/4
{
  "title": "我想看大话西游手游",
  "content": "星爷的大话西游2怎么还没有出来,等不及了"
}

在这里插入图片描述
3、查询:

GET /news_website/news/_search
{
  "suggest": {
    "my-suggest" : {
      "prefix" : "大话西游",
      "completion" : {
        "field" : "title.suggest"
      }
    }
  }
}

这里查出来了3条数据,即以"大话西游"为前缀的文档,而原本的第4条数据没有查出来:
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Elasticsearch中,查询词提示suggestion)功能是通过使用称为“Suggesters”(建议器)的功能来实现的。当启用查询词提示时,Elasticsearch会在内存中维护一个特定的数据结构来支持快速的建议查询。 内存的使用情况主要取决于以下几个因素: 1. 索引大小:索引的大小会直接影响内存的使用情况。如果索引很大,那么建议器需要维护更多的数据结构来支持查询词提示,从而占用更多的内存。 2. 建议器类型:Elasticsearch提供了多种类型的建议器,如term、phrase、completion等。不同类型的建议器会使用不同的数据结构和算法,从而对内存的使用情况产生影响。 3. 数据分布:建议器需要根据数据分布来构建相关的数据结构。如果数据分布不均匀,可能需要更多的内存来存储相关信息。 为了控制内存的使用情况,可以考虑以下几个方面: 1. 硬件资源:确保Elasticsearch集群具有足够的内存资源,以满足建议器所需的内存需求。根据索引大小和查询负载,调整集群的硬件配置,以确保充足的内存可用性。 2. 索引优化:通过调整索引的分片和副本设置,以及优化查询性能,减少对内存的压力。 3. 控制建议器的参数:Elasticsearch提供了一些参数来控制建议器的行为,如size、sort等。根据实际需求,调整这些参数以控制返回结果的数量和排序方式。 4. 监控和优化:定期监控集群的内存使用情况,并根据需要进行优化。可以使用Elasticsearch提供的监控工具和API,如Elasticsearch集群健康API、节点状态API等。 总的来说,内存的使用情况会受到多个因素的影响,包括索引大小、建议器类型和数据分布等。通过合理配置硬件资源、优化索引和建议器参数,并进行监控和优化,可以控制和优化Elasticsearch中查询词提示功能的内存使用情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值