一. 前言
在Python中使用Elasticsearch(ES)通常涉及安装Elasticsearch的Python客户端库,然后通过该库与Elasticsearch集群进行交互。
二. 基本使用
1. 安装Elasticsearch Python客户端库
首先,你需要安装elasticsearch库。你可以使用pip来安装它:
pip install elasticsearch
2. 连接到Elasticsearch集群
在Python中,你可以通过创建一个Elasticsearch对象来连接到Elasticsearch集群。
from elasticsearch import Elasticsearch
# 创建Elasticsearch客户端实例
es = Elasticsearch(['http://localhost:9200'])
# 检查连接是否成功
if es.ping():
print("Successfully connected to Elasticsearch!")
else:
print("Could not connect to Elasticsearch")
3. 执行索引操作
创建索引
在Elasticsearch中,索引类似于关系型数据库中的表。可以使用客户端实例的indices.create()
方法来创建一个新的索引。
# 创建索引的请求体(这里是一个简单的例子,实际使用中可能更复杂)
index_body = {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"field1": {
"type": "text"},
"field2": {
"type": "integer"}
}
}
}
# 创建索引
es.indices.create(index='my_index', body=index_body)
添加文档
可以使用index()
方法来向索引中添加文档。
# 添加文档的请求体
doc_body = {
"field1": "value1",
"field2": 123
}
# 添加文档(指定索引名和文档ID)
es.index(index='my_index', id=1, body=doc_body)
4. 执行搜索操作
使用search()
方法来执行搜索查询。
# 查询DSL
query_body = {
"query": {
"match": {
"field1": "value1"
}
}
}
# 执行搜索
response = es.search(index='my_index', body=query_body)
# 处理响应
for hit in response['hits']['hits']:
print(hit['_source'])
三. 整合封装成一个类来使用
import json
import uuid
from datetime import datetime, timedelta
from elasticsearch import Elasticsearch
from base.common.time_format import get_isoformat_time
from configure.configure import config
from configure.server_config import logger
import time
import traceback
es_conf = config['elasticsearch']
class ElasticSearchService(Elasticsearch):
es_service = None
mappings = {
"properties": {
# "id": {"type": "keyword"},
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
"time": {
"type": "date", "format": "yyyy-MM-dd'T'HH:mm:ss"},
"qst_id": {
"type": "keyword"},
"reply_type": {
"type": "integer"}
}
}
def __init__(self, index_name, addrs, *args, **kwargs):
self.max_result_window = es_conf['max_result_window']
self.username = es_conf['username']
self.password = es_conf['password']
self.index_name = index_name
self.addrs = addrs
super().__init__(self.addrs, basic_auth=(self.username, self.password), request_timeout=3600)
# 1.查询index是否存在
if not self.indices.exists(index=self.index_name):
self.create_index(self.index_name)
if not self.ping():
logger.error(f"ElasticSearchHandler Connection failed")
logger.info(
f"Connect to ElasticService successfully!!! addrs:{
addrs}, index_name:{
self.index_name}")
def create_index(self, index_name):
# 创建索引
if not self.indices.exists(index=index_name):
response