elasticsearch6.5.4搜索(2.查询过程控制)

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 '---------'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值