Python elasticsearch 使用心得
一、配置
python == 3.6/3.8
# 更高版本的elasticsearch会出现doc_type被统一成_doc导致旧版语句报错的情况
pip install elasticsearch==7.8.0
二、连接es
from elasticsearch import Elasticsearch
es = Elasticsearch('ip:port')
三、查看索引是否存在,删除索引
# 浏览器查看索引
# ip:路由地址;port:运行端口(默认9200);index_name:要查看
# 查看所有索引
http://ip:port/_cat/indices?v&pretty
# 查看单个索引
http://ip:port/index_name/_settings?pretty
# 查看单个索引的数据结构
http://ip:port/index_name/?pretty
# python查看elasticsearch是否存在
# es.indices.exists(index="index_name")
# 删除索引
# es.indices.delete(index='index_name', ignore=[400, 404])
三、创建索引与映射
# 索引参数设置
# 索引的静态参数一旦被设置,不能改变;动态参数可以改变
def create_index(es, index_name):
settings = {
'settings':
{
"number_of_shards": 5, # 设置主索引的主分片数,静态参数
"number_of_replicas": 0, # 设置主索引的副本数,动态参数
"max_result_window": 10000000, # 设置一次检索最大返回数量
"track_total_hits": True, # 使最大返回设置生效的参数
}
}
if es.indices.exists(index_name):
print(u"%s 已存在" % index_name)
else:
es.indices.create(index=index_name, body=settings)
print(index_name + "索引创建成功")
res = es.indices.create(index='index_name', ignore=400)
print(res)
# 创建映射(索引内每一个字段的设置)
"""
分词器主要有两种情况会被使用:
第一种是插入文档时,将text类型的字段做分词然后插入倒排索引,对应analyzer
第二种就是在查询时,先对要查询的text类型的输入做分词,再去倒排索引搜索,对应search_analyzer
如果想要让 索引 和 查询 时使用不同的分词器,ElasticSearch也是能支持的,只需要在字段上加上search_analyzer参数
在索引时,只会去看字段有没有定义analyzer,有定义的话就用定义的,没定义就用ES预设的
在查询时,会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义,才会去使用ES预设的
"""
mapping = {
'properties': {
# 简单设置
'title': {
'type': 'string',
'analyzer': 'jieba',
},
# 较复杂的设置
'content': {
'include_in_all': True, # 控制_all查询时是否需要查询该字段,默认True,若是false将不会被_all查询
'analyzer': 'jieba', # 查询和索引统一的分词器
# 'searchAnalyzer': 'jieba', # 单独设置查询分词器
'index': "analyzed", # 控制字段怎样建索引或查询。no不能被查询;not_analyzed只存储原始值,不分词;analyzed分词存储
'boost': 2, # 控制该字段的查询权重,大于1会增加相对权重
'term_vector': 'with_positions_offsets', # 存储完整的term vector信息,包括field terms、position、offset
'type': 'string', # 旧版支持。从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代。
},
}
}
# 设置mapping信息:可以指定字段的类型、是否进行分词、默认值、是否被索引
# 分词器analyzer和搜索分词器search_analyzer。ik_max_word为默认的英文分词器,jieba等其他分词器需要额外安装。
result = es.indices.put_mapping(index='index_name', doc_type='doc', body=mapping)
print(result)
四、查询索引
1、match_all查询所有
body = {
"query": {
"match_all": {},
},
"size": 50, # size不设置会默认返回5条
}
result = es.search(index='index_name', doc_type='doc_type', body=body)
2、分词相关查询
关键词 | keyword类型 | text类型 | 是否支持分词 |
---|---|---|---|
term | 完全匹配 | 查询条件中关键词不会被分词,它必须整个关键词和document中的某个分词匹配,才能搜索到,多个分词时必须连续,顺序不能颠倒。 | 是 |
match | 完全匹配 | match分词结果和text的分词结果有相同的即可 | 否 |
match_phrase | 完全匹配 | match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。 | 是 |
query_string | 完全匹配 | query_string中和match_string基本一样,区别是它不考虑顺序 | 是 |
# term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
body = {
"query": {
"term": {
"content": "汽车保养"
"from": 1, # 从第几个开始返回
"size": 30, # 一次返回多少个
}
}
}
# match 分词,部分匹配查询,包含文本分词后的一个或多个词即符合条件
body = {
"query": {
"match": {"title": "宝马法拉利兰博基尼"},
},
}
# match_phrase 分词,完全匹配查询,包含文本分词后的所有词才符合条件,且匹配词的顺序必须完全按照分词前的顺序
# 例如分词后为宝马、法拉利、兰博基尼,匹配顺序宝马必须在法拉利之前,法拉利必须在兰博基尼之前
body = {
"query": {
"match_phrase": {"title": "宝马法拉利兰博基尼"},
},
}
# query_string,分词,不考虑顺序
body = {
"query": {
"query_string": {
"fields": ["title", "content"],
"query": text,
}
}
}
3、bool组合查询
"""
bool能将多个简单查询组合起来。
使用 must、should、must_not、filter 选项来表示简单查询之间的逻辑,每个选项都可以出现 0 次到多次。
must:文档必须匹配,该选项下的查询条件,相当于逻辑运算的 AND,且参与文档相关度的评分。
should:文档可以匹配 should 选项下的查询条件也可以不匹配,相当于逻辑运算的 OR,且参与文档相关度的评分。
must_not:与 must 相反,匹配该选项下的查询条件的文档不会被返回;需要注意的是,must_not 语句不会影响评分,它的作用只是将不相关的文档排除。
filter:和 must 一样,匹配 filter 选项下的查询条件的文档才会被返回,但是 filter 不评分,只起到过滤功能,与 must_not 相反。
"""
# 例子
{
"query": {
"bool": {
"filter": {
"term": { "status": 1 } # 必须status为1,但是不评分
},
"must_not": {
"range": { "price": { "gte": 70 } } # print必须不大于等于70
},
"must": {
"match": { "title": "java" } # 必须模糊匹配标题title包含java的内容
},
"should": [
{
"match": { "description": "虚拟机" } # 如果description包含虚拟机也匹配
},
{
"match": { "content": "计算公式" } # 如果content包含计算公式也匹配
}
]
}
}
}
"""
控制精度
must 语句必须匹配,但有多少 should 语句应该匹配呢?默认情况下,没有 should 语句是必须匹配的,只有一个例外,那就是当没有 must 语句的时候,至少有一个 should 语句必须匹配。
此外可以通过 minimum_should_match 参数控制需要匹配的 should 语句的数
计算规则
bool 查询采用“匹配越多越好(more_matches_is_better)”的机制,因此满足 must 和 should 子句的文档将会合并起来计算分值。
在 filter 子句查询中,分值将会都返回 0。
must_not 子句并不影响得分,它们存在的意义是排除已经被包含的文档。
如上所述,bool 查询的计算得分主要是 must 和 should 子句,它们的计算规则是,把所有符合 must 和 should 的子句得分加起来,然后乘以匹配子句的数量,再除以子句的总数。
"""
# 个人方法记录:
def diffWordOrQuery(field, size, texts, boolnext=[], boolnext2=[]):
"""
作用: 构建bool查询query查询体
field:str.要检索的字段
size:int.单次检索要返回的数量
texts:list.对检索文本进行分词后的词列表
boolnext:list.bool的下一级key,对每个texts要采取的匹配策略
boolnext2:list.bool的下下一级key,对应match、term、range
"""
if len(boolnext) < len(texts):
for i in range(len(texts) - len(boolnext)):
boolnext.append("should")
if len(boolnext2) < len(texts):
for i in range(len(texts) - len(boolnext2)):
boolnext2.append("should")
body = {
"query": {
"bool": {
},
},
"size": size,
}
for i, text in enumerate(texts):
if text == " ":
continue
method = boolnext[i]
method2 = boolnext2[i]
sonlst = body["query"]["bool"].get(method, None)
if not sonlst:
body["query"]["bool"][method] = {method2: {field: text}}
else:
son = body["query"]["bool"][method]
if type(son) == dict:
for key1, value1 in son.items():
for key2, value2 in value1.items():
body["query"]["bool"][method] = [{key1: {key2: value2}}, {method2: {field: text}}]
else:
son.append({method2: {field: text}})
return body
texts = ["阅读", "语文", "英语", "数学", "政治"]
boolnext = ["must", "must_not", "must"]
boolnext2 = ["term", "match"]
body = diffWordOrQuery("title", 50, texts, boolnext, boolnext2)
print(body)
Python elasticsearch 使用心得的更多相关文章
- python urllib2使用心得
python urllib2使用心得 1.http GET请求 过程:获取返回结果,关闭连接,打印结果 f = urllib2.urlopen(req, timeout=10) the_page = ...
- Python Elasticsearch api,组合过滤器,term过滤器,正则查询 ,match查询,获取最近一小时的数据
Python Elasticsearch api 描述:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.下 ...
- Python Elasticsearch api
描述:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.下面介绍了利用Python API接口进行数据查询,方便 ...
- Python Elasticsearch批量操作客户端
基于Python实现的Elasticsearch批量操作客户端 by:授客 QQ:1033553122 1. 代码用途 1 2. 测试环境 1 3. 使用方法 1 3.1 配置ES服务器信息 1 ...
- Python unittest模块心得(一)
关于unittest模块的一些心得,主要是看官网的例子,加上一点自己的理解,官网地址:https://docs.python.org/3.6/library/unittest.html 基础概念介绍: ...
- python爬虫学习心得:中国大学排名(附代码)
今天下午花时间学习了python爬虫的中国大学排名实例,颇有心得,于是在博客园与各位分享 首先直接搬代码: import requests from bs4 import BeautifulSoup ...
- Python树莓派 爬虫心得
平台: 树莓派 linux 语言:python 搞一个爬虫都清楚是怎么回事,我这里玩过之后有下面的心得: 为什么要用树莓派呢,省电啊,没乱七八糟的桌面问题,可以一直开着. 1.树莓派上的磁盘写入对于不 ...
- python模块学习心得
初始模块 1.什么是模块 模块是用来实现某项功能的一大堆代码,为什么会有模块呢?过程式编程的时候为了减少程序员编程代码的重复性,就利用函数的调用减少了代码的重复性,但是某些时候程序会过于的庞大,我们会 ...
- Python Challenge 过关心得(1)
正式开始第1关,这一关的URL的特殊部分是map. 这关的图片上有一个本子,上面写着K→M,O→Q,E→G,稍微思索就能发现这几个字母都是按照字母表的顺序向后移动了两位,那么最投机取巧的方法就是把ma ...
- Python Challenge 过关心得(0)
最近开始用Openerp进行开发,在python语言本身上并没有什么太大的进展,于是决定利用空闲时间做一点python练习. 最终找到了这款叫做Python Challenge(http://www. ...
随机推荐
- java中的自增运算
本文主要阐明java中的自增运算 1.当i ++ 与 ++ i作为单独语句时,作用与i = i +1一样 2.当赋值时,结果就不一样了 temp = i ++: 操作顺序:1)temp = i: 2) ...
- 云知声: 基于 JuiceFS 的超算平台存储实践
云知声从一家专注于语音及语言处理的技术公司,现在技术栈已经发展到具备图像.自然语言处理.信号等全栈式的 AI 能力,是国内头部人工智能独角兽企业.公司拥抱云计算,在智慧医疗.智慧酒店.智慧教育等方面都 ...
- STL list容器API
list容器:链表容器,不支持随机遍历.不能用通用的sort算法(要有随机访问迭代器),容器自己有排序算法 #define _CRT_SECURE_NO_WARNINGS #include<io ...
- python多进程程序打包成exe的问题
粘贴一下部分的多进程代码 if __name__ == '__main__': """"流程模拟""" multiprocessi ...
- TCS34725 颜色传感器设备驱动程序
一.概述 以前的传感器是用过中断的方式进行计数的,现在已经有 I2C 通行的颜色传感器,不在需要我们像之前那样,通过计数的方式获取数据,直接通过I2C读取即可.当然有通过串口的方式获取采集数据的,串口 ...
- 迁移学习(IIMT)——《Improve Unsupervised Domain Adaptation with Mixup Training》
论文信息 论文标题:Improve Unsupervised Domain Adaptation with Mixup Training论文作者:Shen Yan, Huan Song, Nanxia ...
- 这可能是Feign调用可重试的最佳方案了
前言 在我们公司里,不同的服务之间通过Feign进行远程调用,但是,我们在尝试使调用可重试时遇到了一个小问题,Feign框架本身可以配置的自己的重试机制,但是它是一刀切的方式,所有的调用都是同样的机制 ...
- 腾讯出品小程序自动化测试框架【Minium】系列(三)元素定位详解
写在前面 昨天转发这篇文章时,看到群里有朋友这样说: 这么卷吗?这个框架官方已经不维护了. 姑且不说卷不卷的问题,要是能卷明白,别说还真不错: 不维护又怎样?我想学习,想会,分享给很期待这系列的文章的 ...
- jQuery查找标签、节点操作、事件绑定、Bootstrap页面框架
jQuery查找标签.节点操作.事件绑定.Bootstrap页面框架 一.jQuery查找标签 1.各种选择器 1.基本选择器 $('#id') id选择器 $('.c1') 类(class)选择器 ...
- 借助 Flutter 跨平台特性连接 10 亿玩家 | Flutter 开发者故事
由光子工作室及 Krafton 联合研发的 PUBG MOBILE 依然保持着极高的人气,目前全球有 10 亿玩家,日活跃 5,000 万 (不包括中国大陆地区).从游戏策划伊始,团队就打算为各个平台 ...