ElasticSearch 自动补全 Python 实现

来源:互联网 发布:上海森伯格矩阵 编辑:程序博客网 时间:2024/04/28 22:57

介绍

elasticsearch的suggester共有四类(term suggester, phrase suggester, completion suggester, context suggester), 其中completion suggester作为搜索框中的自动补齐功能,尤为常用。实现一个完整的completion suggester功能,需要三个步骤:创建映射,插入索引数据,搜索数据。
此外,本文此基础上用python实现ES自动补全。希望给大家一点启示吧!

先创建索引、创建映射、插入数据

========================创建映射=========================curl -XPUT localhost:9200/indexcurl -XPUT localhost:9200/index/test/_mapping -d '{  "test" : {        "properties" : {            "name" : { "type" : "string" },            "name_suggest" : { "type" : "completion",                          "analyzer" : "simple",                          "search_analyzer" : "simple",                          "payloads" : true            },        "tag_suggest" : { "type" : "completion",                          "analyzer" : "simple",                          "search_analyzer" : "simple",                          "payloads" : true            }        }    }}'========================插入索引数据=========================curl -XPUT 'localhost:9200/index/test/1?refresh=true' -d '{    "name" : "xdy",    "name_suggest" : {        "input": ["xdy", "hdu"]    }}'curl -XPUT 'localhost:9200/index/test/2?refresh=true' -d '{    "name" : "lz",    "name_suggest" : {        "input": ["lz", "hdu"],    "output": "lz-hdu"    }}'curl -XPUT 'localhost:9200/index/test/3?refresh=true' -d '{    "name" : "xck",    "name_suggest" : {        "input": ["xck", "gbd"]    }}'curl -XPUT 'localhost:9200/index/test/4?refresh=true' -d '{    "name_suggest" : {        "input": [ "hz", "bdata", "cas"]    }}'curl -XPUT 'localhost:9200/index/test/5?refresh=true' -d '{    "tag_suggest" : {        "input": ["bfd", "bdata", "hadoop"]    }}'========================创建查询=========================curl -XPOST 'localhost:9200/index/_suggest?pretty' -d '{    "index-suggest" : {        "text" : "b",        "completion" : {            "field" : "name_suggest"        }    }}'

Python 接口实现自动补全

from elasticsearch import Elasticsearchdef suggest(tag, query, suggest_size=10):    # 设置条件    es_suggest_options = set_suggest_optional(query, tag, suggest_size)    # 发起检索。    es_client = Elasticsearch(hosts=["127.0.0.1:9200"], timeout=5000)    es_result = es_client.suggest(index='index',body=es_suggest_options)    # 得到结果。    final_results = get_suggest_list(es_result)    return final_resultsdef get_suggest_list(es_result):    result_items = es_result['suggest'][0]["options"]    final_results = []    for item in result_items:        final_results.append(item['text'])    return final_resultsdef set_suggest_optional(query, tag, suggest_size):    # 检索选项    es_suggest_options = {        "suggest": {            "text": query,            "completion": {                "field": tag,                "size": suggest_size            }        }    }    return es_suggest_optionsif __name__ == '__main__':    final_results = suggest('name_suggest', 'b', 2)    for item in final_results:        print item    print '========================================='    final_results = suggest('tag_suggest', 'b', 2)    for item in final_results:        print item

输出:
这里写图片描述

说明和参考

相关说明和参考只看官方文档即可:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html#completion-suggester-mapping

关于创建映射时的参数说明:
这里写图片描述

查询补全时参数说明:
这里写图片描述

0 0
原创粉丝点击