elasticsearch6.5.4搜索(2.查询过程控制)
1.搜索类型
query_then_fetch:在所有的分片上执行查询得到对文档进行排序和分级所需信息。然后只在相关分片上查询文档的实际内容。默认使用这个类型
dfs_query_then_fetch:比query_then_fetch多了个额外阶段。在初始查询中执行分布式词频的计算,以得到返回文件的更精确的得分,从而让查询结果更相关。
其他查询类型:略
2.搜索执行偏好
除了可以控制查询是如何执行的,也可以控制在哪些分片上执行查询。默认情况下,Elasticsearch使用的分片和副本,既包含我们已经发送过请求的可用节点,又包括集群中的其他节 点。而且,在大多数情况下,默认行为是最 的查询首选方法。有时我们要更改默认行为,例如, 可能希望只在主分片上执行搜索。为此,可以设置偏好请求参数。
_primary: 只在主分片执行搜索,不使用副本。最新增加/更新的数据还没有复制到副本时,可使用此方式。
_primary_first:主分片可用,则在主分片搜索。否则才在其他分片搜索。
_local:在可能的情况下,只在发送请求的节点上的可用分片上搜索。
_shards:1,2:指定在哪些分片上搜索(此处指定在分片1、2上执行)。_shards参数可以和其他选项合并,但_shards必须在前,例如:_shards:1,2;_local
自定义值:可使用任意字符串,具有相同值的请求,将在相同分片上执行。
3.python 实现
# -*- coding: utf-8 -*-
import json
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
ES_HOST = '127.0.0.1'
ES_USER = ''
ES_PASSWD = ''
ES_PORT = 9002
class ES():
def __init__(self):
self.es = Elasticsearch([ES_HOST], port=ES_PORT, timeout=300)
# def create_index(self, index):
# [略,参见博文](https://blog.youkuaiyun.com/apple9005/article/details/88854635)
# def insert_bulk(self, data_list):
# [略,参见博文](https://blog.youkuaiyun.com/apple9005/article/details/88854635)
def search_data(self, index, doc_type, query, search_type="query_then_fetch", preference="random"):
"""
查询数据
:param self:
:param query: 查询条件
:param search_type: 查询类型 默认值query_then_fetch
:param preference: 搜索执行偏好,默认值random
:return:
"""
rtn = self.es.search(
index=index,
doc_type=doc_type,
scroll='5m',
body=json.dumps(query),
search_type=search_type,
preference=preference,
request_timeout=300
)
return rtn
if __name__ == '__main__':
es = ES()
print '---------'
index = 'library'
doc_type = 'book'
query = {
"min_score":0.5, # 根据查询结果匹配度得分获取数据,分值越高,数据的匹配度越高。此处查询大于等于0.5的数据
"version": True, # 返回版本信息
"size": 2, # 返回2条数据
"query": {"query_string": {"query": "title:crime"}}, # 查询条件
"_source": ["author", "tags", "title", "year"], # 返回指定字段
"script_fields" : { # 使用脚本字段,获取year字段值进行计算,计算结果赋值给新增字段correctYear
"correctYear" : {
"script" : "doc['year'].value - 1000"
}
}
}
# 指定搜索类型
print es.search_data(index, doc_type, query, "dfs_query_then_fetch")
# 指定搜索执行偏好
print es.search_data(index, doc_type, query, "dfs_query_then_fetch", "hello world")
print '---------'