ElasticSearch(6) --查询

tech2024-08-19  43

常用六个查询:

基本查询_source过滤结果过滤高级查询排序高亮 导入数据,这里是采用批处理的API,大家直接复制到kibana运行即可,注意千万别使用kibana的格式化 POST /heima/goods/_bulk {"index":{}} {"title":"大米手机","images":"http://image.leyou.com/12479122.jpg","price":3288} {"index":{}} {"title":"小米手机","images":"http://image.leyou.com/12479122.jpg","price":2699} {"index":{}} {"title":"小米电视4A","images":"http://image.leyou.com/12479122.jpg","price":4288}

1. 基本查询

基本语法

post /索引库名/_search { "query" : { "查询类型" : { "查询条件" : "查询条件值" } } }

这里的query代表一个查询对象, 里面可以有不同的查询属性

查询类型: 例如: match_all, match, term, range 等等查询条件: 查询条件根据类型不同, 写法也有差异,

1.1 查询所有

post /heima/_search { "query" : { "match_all" : {} } } query : 代表查询对象match_all : 代表查询所有
took: 查询花费时间, 单位是 毫秒time_out: 是否超时_shartd: 分片信息hits: 搜索结果总览对象 total: 搜索到总条数 max_score: 所有结果中文档得分的最高分 hits: 搜索结果的文档对象数组, 每个元素是一条搜索到文档对象 _index: 索引库_type: 文档类型_id: 文档id_score: 文档得分_source: 文档的源数据

1.2 匹配查询(match)

1.2.1 or关系

match 类型查询, 会把查询条件进行分词, 然后进行查询, 多个词条之间是or的关系

post /test/_search { "query" : { "match" : { "title" : "小米电视4A" } } }

在上面的案例中, 不仅会查询到电视, 而且与小米相关的都会查询到, 多个词之间是or关系

1.2.2 and关系

post /test/_search { "query" : { "match" : { "title" : {"query":"小米电视4A", "operator":"and"} } } }

1.3 多字段查询

multi_match 与 match 类似, 不同的是 他可以在多个字段中查询

post /test/_search { "query" : { "multi_match" : { "query" : "小米", "fields": ["title", "subtitle"] } } }

1.4 词条查询

term查询被用于精确值 匹配, 这些精确值可能是 数字、时间、布尔或那些未分词的字符串

post /test/_search { "query" : { "term" : { "price" : 2699 } } } post /test/_search { "query" : { "term" : { "price" : { "value" : 2699 } } } }

1.5 多词条精准匹配

terms 查询和term查询一样, 但它允许你指定多值匹配. 如果这个字段包含值中的任何一个值, 那么这个文档满足条件, 类似与mysql的in:

post /test/_search { "query" : { "terms" : { "price" : [2699, 5288] } } }

2. 结果过滤

默认情况下, es在搜索的结果中, 会把文档保存在_source的所有字段都返回. 如果我们只想获取其中的部分字段, 我们可以添加 _source 的过滤

2.1 直接指定字段

post /test/_search { "_source" : ["title", "price"], "query" : { "term" : { "price" : 2699 } } }

2.2 指定includes和excludes

includes: 来指定想要显示的字段excludes: 来指定不想要显示的字段 post /test/_search { "_source" : { "includes" : ["title", "price"] }, "query" : { "term" : { "price" : 2699 } } }

与下面的结果将是一样的

post /test/_search { "_source" : { "excludes" : ["image", "subtitle"] }, "query" : { "term" : { "price" : 2699 } } }

3. 高级查询

3.1 布尔组合

bool 把各种其他查询通过 must(与) must_not(非)的方式进行组合

post /test/_search { "query" : { "bool" : { "must" : {"match": {"title":"小米"}}, "must_not" : {"match":{"title":"电视"}} } } }

3.2. 范围查询(range)

range查询找出哪些落在指定区间内的数字或者时间range查询允许以下内容操作符说明gt大于gte大于或等于lt小于lte小于或等于 # 使用range 完成 3000<=价格 且 价格 < 5000的商品 post /test/_search { "query" : { "range" : { "price" : { "gte" : 3000, "lt" : 5000 } } } }

3.3. 模糊查询(fuzzy)

fuzzy自动将拼写错误的搜索文本, 进行纠正, 纠正以后去尝试索引中的数据 它允许用户搜索词条与实际词条出现偏差, 但是偏差的编辑距离不得超过2:

post /test/_search { "query" : { "fuzzy" : { "title" : "appla" } } }

上面的查询, 也能查询到apple手机 fuzziness 你的搜索文本最多可以纠正几个字母取跟你的数据进行匹配, 默认如果不设置, 就是2我们可以通过

post /test/_search { "query" : { "fuzzy" : { "title" : { "value" : "apple3", "fuzziness": 2 } } } }

4. 排序

4.1. 单字段排序

sort 可以让我们按照不同的字段进行排序, 并且 通过order 指定排序的方式

post /test/_search { "query" : { "match_all": {} }, "sort" : { "price" : "desc" } }

4.2. 多字段排序

假定我们想要结合使用price 和 _score(得分)进行查询, 并且匹配的结果首先按照价格排序, 然后按照相关性得分排序:

post /test/_search { "query" : { "match_all" : {} }, "sort" : [ {"price" : {"order": "desc"}}, {"_score" : {"order" : "desc"}} ] }

5. 高亮

post /test/_search { "query" : { "match" : { "title" : "电视" } }, "highlight" : { "pre_tags": "<font color='pink'>", "post_tags": "</font>", "fields": { "title" : {} } } }

在使用match查询的同时, 加上一个highligh属性:

pre_tags 前置标签post_tags 后置标签fields : 需要高亮的字段 title: 这里声明title字段需要高亮, 后面可以为这个字段设置特有配置, 也可以为空

6. 分页

post /test/_search { "query" : { "match_all": {} }, "sort" : { "price" : "desc" }, "size" : 2, "from" : 2 }

size: 每页显示多少条 from : 当前页起始索引, int start = (pageNum - 1) * size;

最新回复(0)