安装ES和kibana
安装:
docker pull elasticsearch:7.17.1
docker pull kibana:7.17.1
启动:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" elasticsearch:7.17.1
docker run -d --name kibana -p 5601:5601 kibana:7.17.1
注意⚠️:ES版本和kibana版本要一致
python安装es包
pip install elasticsearch
创建ES客户端
from elasticsearch import Elasticsearch
class ElasticSearchClient:
_client = None
def __new__(cls, *args, **kwargs):
if cls._client is None:
# check elasticsearch service url
if not settings.ELASTIC_SEARCH_URL:
raise ValueError("Please provide the elasticsearch service url.")
cls._client = Elasticsearch(
[settings.ELASTIC_SEARCH_URL],
http_auth=[
settings.ELASTIC_SEARCH_USER,
settings.ELASTIC_SEARCH_PASSWORD,
],
timeout=60,
)
return cls._client
创建/删除索引
def index():
es_client = ElasticSearchClient()
es_client.index(index="索引名称", id=id, body=doc)
def delete_index():
es_client = ElasticSearchClient()
es_client.delete(index="索引名称", id=id)
查询
es_client = ElasticSearchClient()
def do_match():
resp = es_client.search(
index="索引名称",
body={
"query": {"ES搜索语法"},
"script_fields": self.script_fields,
"min_score": "最低分", 不返回低于最低分的文档
},
_source="是否显示文档详情", #False 我们只需要文档的id,然后根据id去数据库拿详细的信息
size="搜索数量",
)
"""
返回的结构是这样,我们只要匹配到的文档即可
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "jobs",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0
}
]
}
}
"""
# 文档关键信息是_id和_score
return resp["hits"]["hits"]