• ElasticSearchDSL


    DSL Query的分类

    • 查询所有:查询出所有数据,一般测试用。match_all
    • 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中进行匹配。例如:
      • match_query
      • multi_match_query
    • 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如
      • ids
      • range
      • term
    • 地理(geo)查询:根据经纬度查询。例如:
      • geo_distance
      • geo_bounding_box
    • 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件
      • bool
      • function_score

    DSL Query基本语法

    查询的基本语法如下:

    GET /indexName/_search
    {
    	"query":{
    		"查询类型":{
    			"查询条件":"条件值"
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    全文检索查询:

    match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:

    GET /indexName/_search
    {
     	"query":{
            "match":{
                "FIELD":"TEXT"
            }
        }   
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    multi_match:与match查询类似,只不过允许同时查询多个字段,语法:

    GET /indexName/_search
    {
     	"query":{
            "multi_match":{
                "query":"TEXT",
                "fields":["FIELD1" , "FIELD2"]
            }
        }   
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    match和multi_match的区别:

    • match:根据一个字段查询
    • multi_match:根据多个字段查询,参与查询字段越多,查询性能越差
    精确查询

    精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词

    term查询:

    GET /indexName/_search
    {
        "query":{
            "term":{
                "FIELD":{
                    "value":"VALUE"
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    range查询:

    GET /idnexName/_search
    {
        "query":{
            "range":{
                "FIELD":{
                    "gte":10,
                    "lte":20
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    地理查询
    • geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档
    GET /indexName/_search
    {
        "query":{
            "geo_bounding_box":{
                "FIELD":{
                    "top_left":{
                        "lat":31.1,
                        "lon":121.5
                    },
                    "bottom_right":{
                        "lat":30.9,
                        "lon":121.7
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • geo_distance:查询到指定中心点小于某个距离值的所有文档
    GET /indexName/_search
    {
        "query":{
            "geo_distance":{
                "distance":"15km",
                "FIELD":"31.21,121.5"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    复合查询

    复合查询:将其他的简单查询组合起来,实现更复杂的搜索逻辑,例如:

    • function score:算分函数查询,可以控制文档相关性算分,控制文档排名,例如百度竞价

    elasticsearch中的相关性打分算法是什么?

    • TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大
    • BM25:在elasticsearch5.0之后,会随着次品增加而增大,但增长曲线会趋于水平

    Function Score Query

    使用function score query,可以修改文档的相关性算分,根据新得到的算分排序

    算分函数的结果称为function score , 将来会与query score运算,得到新算分,常见的算分函数有:

    • weight:给一个常量值,作为函数结果
    • field_value_factor:用文档中的某个字段值作为函数结果
    • random_score:随机生成一个值,作为函数结果
    • script_score:自定义计算公式,公式结果作为函数结果

    甲醛模式,定义functionscore与queryscore的运算方式,包括:

    • multiply:两者相乘。默认就是这个
    • replace:用function score替换query score
    • 其他:sum、avg、max、min

    function score query定义的三要素是什么

    • 过滤条件:哪些文档要加分
    • 算分函数:如何计算function score
    • 加权方式:function score 与 query score如何运算

    复合查询 Boolean Query

    布尔查询是一个或多个查询子句的组合。子查询的组合方式有:

    布尔查询是一个或多个查询子句的组合。子查询的组合方式有:

    • must:必须匹配每个子查询,类似“与”
    • should:选择性匹配子查询,类似“或”
    • must_not:必须不匹配,不参与算分,类似“非”
    • filter:必须匹配,不参与算分

    排序

    elasticsearch支持对搜索结果排序,默认是根据相关度算分来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

    分页

    from+size:

    • 优点:支持随机翻页
    • 缺点:深度分页问题,默认查询上限(from+size)是10000
    • 场景:百度、京东、谷歌这样的随机翻页搜索

    after search:

    • 优点:没有查询上限(单词查询的size不超过10000)
    • 缺点:只能向后逐页查询,并且搜索结果是非实时的
    • 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页

    scroll:

    • 优点:没有查询上限
    • 缺点:会有额外内存消耗,并且搜索结果是非实时的
    • 场景:海量数据的获取和迁移。
  • 相关阅读:
    数据结构之详解【排序算法】
    基础 | JVM - [内存模型 & JMM]
    【Matterport3D模拟器安装详细教程】适用于离散视觉语言导航任务的环境部署与安装
    【Redis】内存回收:内存淘汰策略
    UI自动化测试框架设计(Selenium)
    Python3中的“加和”函数
    网安新声 | 微软蓝屏事件安全启示录
    Web 标准是什么
    C++ 对象克隆关键点
    T31开发笔记: 移动侦测
  • 原文地址:https://blog.csdn.net/yuanyajieh/article/details/138036708