ElasticSearch中查询语句用法(match、match_phrase、multi_match、query_string)

2023-10-21 09:59

本文主要是介绍ElasticSearch中查询语句用法(match、match_phrase、multi_match、query_string),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、match

1.1 不同字段权重

        如果需要为不同字段设置不同权重,可以考虑使用 bool 查询的 should 子句来组合多个 match 查询,并为每个 match 查询设置不同的权重。

{"query": {"bool": {"should": [{"match": {"product_name": {"query": "apple","boost": 3}}},{"match": {"description": {"query": "apple","boost": 1}}}]}}
}

        上面的查询将在 product_name 字段和 description 字段中搜索包含 "apple" 的文档,并为 product_name 字段设置权重为 3,而为 description 字段设置权重为 1。这样,在计算匹配得分时,product_name 字段的匹配将比 description 字段的匹配更加重要,因为它的权重更高。

        这种方式可以灵活地控制不同字段的权重,以满足不同的搜索需求。

2、match_pharse

        match_phrase 查询是 Elasticsearch 中一种用于精确匹配短语的查询方式,可以确保查询字符串中的关键词按照给定的顺序在文档中连续出现。以下是 match_phrase 查询的用法:

2.1 简单用法

        match_phrase 查询可以直接指定一个字段和一个短语进行匹配。

GET grade2/_search
{"query": {"match_phrase": {"character": "谦虚 态度"}},"track_total_hits": true
}

上面的查询将在 character字段中搜索包含短语 "谦虚 态" 的文档。

2.2 位置信息

        match_phrase 查询会记录匹配短语在文档中的位置信息,可以通过 slop 参数指定允许的位置偏移量。

GET grade2/_search
{"query": {"match_phrase": {"character": {"query": "谦虚 赞扬","slop": 2}}},"track_total_hits": true
}

3、multi_match

        multi_match 查询是 Elasticsearch 中一种用于在多个字段中搜索相同查询字符串的查询方式。它可以在多个字段之间执行相同的查询,并且可以指定不同字段之间的权重(boost),从而影响匹配的相对重要性。

3.1 简单用法

        multi_match 查询可以直接指定一个查询字符串,然后在多个字段中进行搜索。

GET grade2/_search
{"query": {"multi_match": {"query": "张一","fields": ["name", "character"]}},"track_total_hits": true
}

上面的查询将在 name和 character字段中搜索包含 "张一" 的文档。

3.2 类型匹配

multi_match 查询可以通过 type 参数指定匹配的类型,如 "best_fields"、 "most_fields"、 "cross_fields"、 "phrase"、 "phrase_prefix" 等。不同的类型在匹配方式和结果计算上有所不同。

GET grade2/_search
{"query": {"multi_match": {"query": "张一","fields": ["name", "character"],"type": "best_fields"}}
}

上面的查询将使用 "best_fields" 类型在 name 和 character字段中搜索包含短语 "张一" 的文档。

4、query_string

        在 Elasticsearch 中,query_string 是一种查询方式,用于在文本字段上执行灵活且强大的搜索操作。query_string 查询支持使用 Lucene 查询语法进行高级搜索,可以通过在查询字符串中指定不同的搜索条件、操作符和逻辑关系来构建复杂的搜索查询。

4.1 简单的关键词匹配

GET grade2/_search
{"query": {"query_string": {"default_field": "character","query": "乐观"}},"track_total_hits": true
}

上面的查询将在 character字段中搜索包含关键词 "乐观" 的文档。

4.2 使用逻辑关系和操作符进行组合查询:

GET grade2/_search
{"query": {"query_string": {"default_field": "character","query": "乐观 OR (赞扬 AND 优越)"}},"track_total_hits": true
}

上面的查询将在 character字段中搜索包含关键词 "乐观" 或者 “赞扬 和 优越”的文档。

GET grade2/_search
{"query": {"query_string": {"default_field": "character","query": "乐观 OR (name:刘一 AND age:25 AND 优越)"}},"track_total_hits": true
}

        上面的查询将在 character字段中搜索包含关键词 "乐观" 或者 name字段为 "刘一" 且 age字段为"25" 且 character字段为 “优越” 的文档。

4.3 模糊搜索和通配符搜索

GET account_info/_search
{"query": {"query_string": {"default_field": "email","query": "qq?com~"}}
}
GET account_info/_search
{"query": {"query_string": {"default_field": "email","query": "qqcom~"}}
}

        上面的查询将在 email字段中搜索类似于 "qq?com" 的词,其中 "?" 表示单个字符的通配符, "~" 表示模糊搜索,"*" 表示多个字符的通配符。

GET account_info/_search
{"query": {"query_string": {"default_field": "email","query": "qqcom~","fuzziness": 1}}
}

        可以指定模糊搜索的最大编辑距离。上面的查询将在文档中搜索与 "qqcom~" 关键词的拼写相似且最大编辑距离为 1的文档。

4.4 指定搜索字段和搜索条件

GET grade2/_search
{"query": {"query_string": {"fields": ["name", "age"],"default_operator": "AND", "query": "name:刘一, age:26"}},"track_total_hits": true
}
GET grade2/_search
{"query": {"query_string": {"fields": ["name", "age"],"default_operator": "AND", "query": "name:刘一 age:26"}},"track_total_hits": true
}
GET grade2/_search
{"query": {"query_string": {"fields": ["name", "age"],"default_operator": "AND", "query": "name:刘一 AND age:26"}},"track_total_hits": true
}

GET grade2/_search
{"query": {"query_string": {"fields": ["name", "age"],"default_operator": "AND", "query": "name:刘一 AND age:[25 TO 26]"}},"track_total_hits": true
}

        上面的查询将在 name 和 age 字段中搜索包含关键词 "刘一" 并且年龄在 25 到 26 之间的文档,其中 fields 参数用于指定搜索字段,default_operator 参数用于指定默认的逻辑操作符。

        需要注意的是,query_string 查询可能存在安全风险,因为它允许直接执行用户输入的查询字符串,可能导致潜在的搜索注入攻击,因此在使用时需谨慎验证和过滤用户输入,以防止安全漏洞。同时,根据实际需求和场景,可以根据 Elasticsearch 的文档和查询语法进行更多的配置和优化。

这篇关于ElasticSearch中查询语句用法(match、match_phrase、multi_match、query_string)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/253630

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

oracle中exists和not exists用法举例详解

《oracle中exists和notexists用法举例详解》:本文主要介绍oracle中exists和notexists用法的相关资料,EXISTS用于检测子查询是否返回任何行,而NOTE... 目录基本概念:举例语法pub_name总结 exists (sql 返回结果集为真)not exists (s

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

Springboot中Jackson用法详解

《Springboot中Jackson用法详解》Springboot自带默认json解析Jackson,可以在不引入其他json解析包情况下,解析json字段,下面我们就来聊聊Springboot中J... 目录前言Jackson用法将对象解析为json字符串将json解析为对象将json文件转换为json

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)