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":{
		"查询类型":{
			"查询条件":"条件值"
		}
	}
}
全文检索查询:

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

GET /indexName/_search
{
 	"query":{
        "match":{
            "FIELD":"TEXT"
        }
    }   
}

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

GET /indexName/_search
{
 	"query":{
        "multi_match":{
            "query":"TEXT",
            "fields":["FIELD1" , "FIELD2"]
        }
    }   
}

match和multi_match的区别:

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

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

term查询:

GET /indexName/_search
{
    "query":{
        "term":{
            "FIELD":{
                "value":"VALUE"
            }
        }
    }
}

range查询:

GET /idnexName/_search
{
    "query":{
        "range":{
            "FIELD":{
                "gte":10,
                "lte":20
            }
        }
    }
}
地理查询
  • 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
                }
            }
        }
    }
}
  • geo_distance:查询到指定中心点小于某个距离值的所有文档
GET /indexName/_search
{
    "query":{
        "geo_distance":{
            "distance":"15km",
            "FIELD":"31.21,121.5"
        }
    }
}
复合查询

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

  • 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:

  • 优点:没有查询上限
  • 缺点:会有额外内存消耗,并且搜索结果是非实时的
  • 场景:海量数据的获取和迁移。

相关推荐

  1. ElasticSearchDSL

    2024-04-21 18:20:03       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 18:20:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 18:20:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 18:20:03       87 阅读
  4. Python语言-面向对象

    2024-04-21 18:20:03       96 阅读

热门阅读

  1. 深度学习框架比较:TensorFlow vs PyTorch

    2024-04-21 18:20:03       40 阅读
  2. Flask、Django和Tornado怎么选

    2024-04-21 18:20:03       38 阅读
  3. ollama 开源大语言模型平台

    2024-04-21 18:20:03       38 阅读
  4. 嵌入式学习——C语言基础——day4

    2024-04-21 18:20:03       36 阅读
  5. MapReduce分区机制(Hadoop)

    2024-04-21 18:20:03       37 阅读
  6. 如何在SpringBoot中集成MyBatis?

    2024-04-21 18:20:03       39 阅读
  7. tomcat中Pipeline-Valve解析

    2024-04-21 18:20:03       37 阅读
  8. “文心一言”的使用

    2024-04-21 18:20:03       36 阅读
  9. 深度剖析“字符串与数组、指针”的关系

    2024-04-21 18:20:03       40 阅读
  10. Python的pytest框架(5)--测试标记(Markers)

    2024-04-21 18:20:03       37 阅读
  11. vue3自定义多个v-model以及自定义修饰符

    2024-04-21 18:20:03       39 阅读
  12. C语言程序每日一练(7)

    2024-04-21 18:20:03       34 阅读