es 中文前缀短语匹配(搜索智能补全) prefix查询和completion suggester两种方式

这篇具有很好参考价值的文章主要介绍了es 中文前缀短语匹配(搜索智能补全) prefix查询和completion suggester两种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求:es进行前缀匹配,用来进行智能补全
方式一:正常索引库类型,字段类型为text
过程:es正常的prefix只能进行词语匹配,而中文的分词大部分按字分词,不按语义分词,所以无法搜索出正确的前缀匹配,而能进行短语匹配的match_phrase_prefix匹配,是正常按前几个词进行匹配,最后一个词进行前缀匹配,也不满足要求。查阅很多资料发现,离正确答案只差一个keyword
代码

curl -X POST "localhost:9200/information_completion/_search?pretty" -H 'Content-Type:application/json' -d '{
  "_source": ["text"],
  "text": {
    "prefix": {
      "text.keyword": "中云街"
    }
  }
}
'

参考资料


以上方式存在的问题是:无法计算得分,前缀匹配到的所有记录的得分,也就是score,是一致的,那么引入方式二,重新建库。


方式二:使用completion suggester建议器建库
流程:使用以下代码建立索引,建出来字段类型为completion,然后用建议器的方式进行前缀搜索匹配,可以通过建库时自定义权重的方式,使得搜索的结果得分不一致,并且使得自己所需要的热词权重较高。

建库curl代码

curl -X PUT "localhost:9200/info_completion" -H 'Content-Type: application/json' -d '
{
    "mappings" : {
      "properties" : {
        "id" : {
          "type" : "text"
        },
        "query" : {
          "type" : "completion",
          "analyzer" : "ik_max_word"
        },
        "text" : {
          "type" : "text",
          "analyzer" : "ik_max_word",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
}
'

(需要注意的是,如果字段类型为completion,就无法正常使用term query以及match等方式来查询了,如果两者都需要支持,需要再加一个text字段来保存)。

建库脚本

file_path = "/home/xxx/xxx.txt"
with open(file_path, 'r', encoding="utf-8") as f:
    lines = f.readlines()

i = 0
for line in lines:
    data = line.split()
    d = {"id": data[0], "query": data[1]}
    # print(json_str)
    es.index(index="information_completion", id=i, body=d)
    i += 1
es.indices.refresh(index="information_completion")

print("finish")

查询curl代码

curl -X POST "localhost:9200/info_completion/_search?pretty" -H 'Content-Type:application/json' -d '
{
  "suggest": {
    "info_suggest": {
      "prefix": "农业银行",
      "completion": {
        "field": "query",
        "size": "10"
      }
    }
  }
}
'

查询脚本片段

def get_prefix_res(query, size):
    res = []
    start = 0
    query_body = {
        "suggest": {
            "info_suggest": {
                "prefix": query,
                "completion": {
                    "field": "query",
                    "size": size
                }
            }
        }
    }
    data = es.search(index="information_completion", body=query_body)
    print("get_prefix: ")
    suggest = data['suggest']['info_suggest'][0]["options"]
    for i in range(0, min(10, len(suggest))):
        d = {"score": suggest[i]["_score"], "content": suggest[i]["_source"]["query"]}
        print(d)
        res.append(d)
    if len(suggest) == 0:
        return res
    max_val = suggest[0]["_score"]
    min_val = suggest[len(suggest) - 1]["_score"]
    for item in res:
        item["score"] = cal_val(item.get("score"), max_val, min_val)
    print(res)
    print(max_val, ' ', min_val, ' ', len(suggest))
    return res

参考资料
https://zhuanlan.zhihu.com/p/666534606
https://www.cnblogs.com/Neeo/articles/10695019.html文章来源地址https://www.toymoban.com/news/detail-819819.html

到了这里,关于es 中文前缀短语匹配(搜索智能补全) prefix查询和completion suggester两种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TensorFlow 中前缀 prefix

    前缀 prefix 主要用于命名 TensorFlow 中的变量,以避免变量名冲突。在 TensorFlow 中,每个变量都有一个唯一的名称,由变量的作用域和变量的名称组成。作用域可以通过 tf.variable_scope() 函数来创建,而变量的名称通常是由用户指定的。 在深度学习模型中,通常会有很多变量需要

    2024年02月14日
    浏览(32)
  • 如何根据子网掩码计算出网络前缀(prefix)

    我们知道子网掩码是对IP地址的网络地址的标注。把IP地址中网络地址位设置为1,主机地址位设置为0,得到的就是子网掩码。除了用子网掩码表示IP地址的网络地址和主机地址外,还可以用network prefix(网络前缀),比如192.168.0.1/16,这里的16就是prefix,也就是网络地址位的位

    2023年04月15日
    浏览(39)
  • Elasticsearch (ES) 搜索引擎: 搜索功能:搜索分页、搜索匹配、全文搜索、搜索建议、字段排序

    原文链接:https://xiets.blog.csdn.net/article/details/132348920 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) ES 搜索 API 官网文档:Search APIs 先创建一个索引,并写入一些文档用于搜索示例: 写入一些文档示例: 官网API:The _source option 搜索结果中的文档数据封装

    2024年02月08日
    浏览(53)
  • ElasticSearch系列 - SpringBoot整合ES之全文搜索匹配查询 match

    官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html 权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search.html 1. 数据准备 官方测试数据下载地址:https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip ,数据量很大,我们自己构造数据吧。 2. m

    2023年04月08日
    浏览(52)
  • ES自动补全

    要实现根据字母做补全,就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。地址:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin. 或者: 链接:https://pan.baidu.com/s/1IH6YEaa0ol039plev1wnag?pwd=dvl5  提取码

    2024年01月20日
    浏览(38)
  • elasticsearch的搜索补全提示

    当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项 要实现根据字母做补全,就必须对文档按照拼音分词,GitHub上有拼音分词插件 GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin. 解压到一个文件夹中去

    2024年02月10日
    浏览(38)
  • Stable Diffusion 中英文对照&中文tag补全

    Stable Diffusion是老外做的,因此全部界面都是英文的,因此会对国内很多英语不好的小伙伴来说是一个灾难,不过这里介绍大家一个自定义翻译插件的方法如下图。 还有我们在输入的时候,由于英语水平有限对我们造成阻碍,这里还有一个输入中文即可获得英文单词的

    2024年02月12日
    浏览(40)
  • 微服务——ES实现自动补全

    在搜索框根据拼音首字母进行提示     和IK中文分词器一样的用法,按照下面的顺序执行。  重启完成之后进行拼音分词可以看见每个字都有,以及整个词语首字母组合成的一个。 ​ 只用默认的功能还远远不够。 先用ik进行分词,再用拼音分词器分 ​   ​  在test这份索引

    2024年02月14日
    浏览(34)
  • ES(二)| 安装ES、Kibana、IK分词器、拼音分词器(自动补全)

    上一篇:ES(一)| ES简介、倒排索引、索引库操作语法、文档操作语法、Java使用RestClient进行ES操作 安装包下载: 链接:https://pan.baidu.com/s/1Y1O0B8aG7qzRLFFVYo9nHw 提取码:hdyc 因为我们还需要部署 kibana 容器,因此需要让 es 和 kibana 容器互联。这里先创建一个网络: 这里我采用

    2023年04月08日
    浏览(56)
  • 〔021〕Stable Diffusion 之 提示词反推、自动补全、中文输入 篇

    如果想快速读取图片中的提示词,虽然系统在图生图中自带了 CLIP反推 和 DeepBooru反推 功能 但是系统自带这两个反推功能,只能大概的检测一些提示词,并不是非常的准确,如果想准确的获取图片中的提示词,推荐

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包