• elasticsearch的docker安装与使用


    安装

    docker network create elastic
    
    docker pull docker.elastic.co/elasticsearch/elasticsearch:8.10.4
    
    # 增加虚拟内存, 此处适用于linux
    vim /etc/sysctl.conf # 添加 vm.max_map_count=262144
    # 重新启动
    sysctl vm.max_map_count
    
    
    docker run --name es01 --net elastic -p 9200:9200 -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.10.4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    成功后会出现下图
    在这里插入图片描述
    密码保存,可以先重置:

    docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
    docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
    
    • 1
    • 2

    复制证书以供ssl访问

    docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .
    
    • 1

    使用

    connect

    from elasticsearch import Elasticsearch
    
    
    NODES = [
        "https://localhost:9200",
        "https://localhost:9201",
        "https://localhost:9202",
    ]
    
    # Password for the 'elastic' user generated by Elasticsearch
    ELASTIC_PASSWORD = ""
    
    # Create the client instance
    client = Elasticsearch(
        NODES,
        ca_certs="/path/to/http_ca.crt",
        basic_auth=("elastic", ELASTIC_PASSWORD)
        # 支持多种登陆方式
        # api_key=("api_key.id", "api_key.api_key")
        # bearer_auth="token-value"
        # ssl_assert_fingerprint=CERT_FINGERPRINT,
    )
    
    # Successful response!
    client.info()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    index

    mapping = {
        "settings": {
            "analysis": {
                "analyzer": {
                    "latex_analyzer": {
                        "type": "standard",  # 使用标准分析器作为基础
                        "stopwords": "_none_"  # 不使用停用词
                    }
                }
            }
        },
        "mappings": {
            "properties": {
                "question": {
                    "type": "text",
                    "analyzer": "latex_analyzer"  # 使用上面定义的分析器
                }
            }
        }
    }
    
    # 创建索引
    es.indices.create(index="questions_index", body=mapping)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    insert

    from elasticsearch import Elasticsearch, helpers
    
    insert_df = df["question"].to_frame()
    
    insert_df.head()
    
    def doc_generator(df, index_name):
        df_iter = df.iterrows()
        for index, document in df_iter:
            yield {
                "_index": index_name,
                "_id": index,      
                "_source": document.to_dict(),
            }
    
    helpers.bulk(es, doc_generator(insert_df, 'questions_index'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    query

    search_query = {
        "query": {
            "match": {
                "question": "数轴上A、B两点所表示的有理数的和是"
            }
        }
    }
    
    response = es.search(index="questions_index", body=search_query)
    
    for hit in response['hits']['hits']:
        print(hit['_source']['question'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    import ujson
    
    # 原始查询
    query_string = '''{
        "query": {
            "bool": {
                "must": [
                    {
                        "bool": {
                            "must": [
                                {
                                    "bool": {
                                        "should": [
                                            {
                                                "multi_match": {
                                                    "query": "数轴上A、B两点所表示的有理数的和是",
                                                    "fields": ["question^3", "question.raw^3", "question.search^1", "question.autosuggest^1", "question.english^1"],
                                                    "type": "cross_fields",
                                                    "operator": "and"
                                                }
                                            },
                                            {
                                                "multi_match": {
                                                    "query": "数轴上A、B两点所表示的有理数的和是",
                                                    "fields": ["question^3", "question.raw^3", "question.search^1", "question.autosuggest^1", "question.english^1"],
                                                    "type": "phrase",
                                                    "operator": "and"
                                                }
                                            },
                                            {
                                                "multi_match": {
                                                    "query": "数轴上A、B两点所表示的有理数的和是",
                                                    "fields": ["question^3", "question.raw^3", "question.english^1"],
                                                    "type": "phrase_prefix",
                                                    "operator": "and"
                                                }
                                            }
                                        ],
                                        "minimum_should_match": "1"
                                    }
                                }
                            ]
                        }
                    }
                ]
            }
        }
    }'''
    
    
    query_dict = ujson.loads(query_string)
    response = es.search(index='questions_index', body=query_dict)
    
    for hit in response['hits']['hits']:
        print(hit['_source'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
  • 相关阅读:
    Django ORM进阶应用
    android-适配方案-密度适配-最小宽度限定符
    VS2019代码中包含中文内容导致的编译错误和打印输出乱码问题
    计算机毕业设计Java校园跑腿平台演示录像2020(源码+系统+mysql数据库+Lw文档)
    Python的优点和缺点
    一文读懂LSTM及手写LSTM结构
    pod(七):静态pod
    性能测试的流程+调优顺序
    数字人直播系统源码交付,数字人直播软件下载迎来普及化
    Windows 10怎么清理磁盘空间?
  • 原文地址:https://blog.csdn.net/majiayu000/article/details/133932115