相关文章推荐
爽快的手链  ·  1593 ...·  1 年前    · 

问题描述:

我们都知道ES针对复杂的多添加组合查询非常强大,也知道通过match可以实现全文检索查询(分词查询),但是如果现在我只需要实现类似mysql中的like全匹配模糊查询,该怎么实现呢?

业务场景:

从content_index表中查询字段content中包含ES的记录。
在关系型数据库中对应的SQL语句:

SELECT 
    content
FROM  content_index
WHERE  content   like '%ES%'

数据准备:

## 删除索引
## DELETE content_index
## 新建索引
PUT content_index
  "mappings": {
    "properties": {
      "content": {
        "type": "wildcard"
## 添加数据
POST content_index/_bulk?refresh
{ "create": { } }
{ "content": "老万最近正在学习ES"}
{ "create": { } }
{ "content": "老万精通JAVA"}
{ "create": { } }
{ "content": "ES从入门到放弃"}

说明:
ElasticSearch 5.0以后,String字段被拆分成两种新的数据类型: text用于全文搜索,会分词,而keyword用于关键词搜索,不进行分词。

补充:官网对wildcard字段类型的说明
在这里插入图片描述
说明:
1、采用wildcard通配符查询的字段推荐采用字段type设置为wildcard。
2、text字段会进行分词,wildcard通配符查询检索的是分词后的数据。
3、keyword字段虽然不会进行分词,但执行通配符wildcard查询(特别是带有前导通配符的模式)很慢。

实现方案:

1、sql实现

POST /_sql?format=txt
  "query": "SELECT content FROM content_index Where content like '%ES%'"

查询结果:
在这里插入图片描述
转为DSL查看底层实现:

POST /_sql/translate
  "query": "SELECT content FROM content_index Where content like '%ES%'"

执行结果:
底层就是基于wildcard的通配符查询,其中?和*分别代替一个和多个字符。

"size" : 1000, "query" : { "wildcard" : { "content" : { "wildcard" : "*ES*", "boost" : 1.0 "_source" : false, "stored_fields" : "_none_", "docvalue_fields" : [ "field" : "content" "sort" : [ "_doc" : { "order" : "asc"

2、dsl实现

利用wildcard通配符查询实现,其中?和*分别代替一个和多个字符。

GET content_index/_search
  "query": {
    "wildcard": {
      "content": {
        "value": "*ES*"

查询结果:

"took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 "hits" : { "total" : { "value" : 2, "relation" : "eq" "max_score" : 1.0, "hits" : [ "_index" : "content_index", "_type" : "_doc", "_id" : "E3E0BnsBxW9JEct2L-d4", "_score" : 1.0, "_source" : { "content" : "老万最近正在学习ES" "_index" : "content_index", "_type" : "_doc", "_id" : "FXE0BnsBxW9JEct2L-d4", "_score" : 1.0, "_source" : { "content" : "ES从入门到放弃"

本文主要介绍了ES中通过wildcard通配符查询实现like模糊查询。
而sql查询的方式显然适合大众口味。
使用wildcard通配符查询的目标字段的type类型需要设置为wildcard。

问题描述:我们都知道ES针对复杂的多添加组合查询非常强大,也知道通过match可以实现全文检索查询(分词查询),但是如果现在我只需要实现类似mysql中的like全匹配模糊查询,该怎么实现呢?业务场景:从content_index表中查询字段content中包含ES的记录。在关系型数据库中对应的SQL语句:SELECT contentFROM content_indexWHERE content like '%ES%'数据准备:## 删除索引## DELETE co
(1)where型子查询 对于where型子查询,就是先查询出所想查询数据的标识符,然后再通过where将数据库与标识符所对应的行取出来。 (2)from型子查询 对于from型子查询,就是将第一次查询出来的结果当作一个表,再对表的数据进行操作,得到所要查询的数据。 (3)exist型子查询 exist需要在两个有关联的表进行使用,通过exist可以判断出一个“交集”,然后将这个交集取出来。 for exaple: 我们现在有一个数据库 这个数据库包含了两个人的各科成绩以及一列id号。 **题目:
前段时间第一次使用es实现全文索引功能,由于第一次使用,所以只想实现类似数据库 LIKE ‘%关键字%’这样的就可以了。 简单研究了一下es之后,发现将字段类型指定为keyword或查询字段加上.keyword,然后再通过*实例模糊匹配,如下面查询,就可以实现类似LIKE ‘%关键字%’的搜索。 GET /my_index/_doc/_search "query": { "query_s...
Elasticsearch是一个基于Lucence的搜索服务器。它提供了一个分布式的搜索引擎,基于restful web接口。广泛应用于云计算,能够实时搜索,具有稳定,可靠,快速的特点。 二.为啥要学习Elasticsearch? 它其实也是一种数据库的优化方案,它的强大之处在于模糊查询。如果是普通数据库查询 like%xxxx%,其实是不走索引的。只要你的数据库的量很大,你的查询肯定会是秒级别的。(es搜索速度很快) 用户输入其实没那么精确或者打错,Elasticsearch却能返回用 ​ 在es我们通过查询某个关键字,从而查询到关键字相关的数据。那么他是怎么去找的? ES默认的支持对英文的分词,因为英文都是以空格分词,而对于文的分词效果并不太好 也就是对一句话进行分词的叫做分词器。 2 ik分词器 2.1 安装ik分词器 ##1. 将下载好的zip的压缩包拷贝到es的plugins目录下 ##2. 在此目录下创建一个ik的目录 ##3. 在ik目录下将刚才zip压缩包解压 [root@hadoop plugins]# mkdir ik 1.match 分词匹配查询和match_phrase短语查询 Elasticsearch的match_phrase短语查询跟match的区别就是,关键词作为一个整体进行搜索,而不是拆分成一个个关键词。 当匹配对象为文时,建议使用: MatchPhraseQueryBuilder query = QueryBuilders.matchPhraseQuery("name", "*"+req.getName()+"*"); 2.wildcard 通配符检索 类似SQL
一:es精确查询模糊查询es精确查询使用WildcardQueryBuilder :精确查询模糊查询的区别是被模糊的字段值是否加匹配符 *、?,*匹配任意多个,?只匹配一个; SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder =...
查询每个部门的平均工资,要求平均工资大于2000 select deptno,avg(sal) from emp group by deptno having avg(sal)>2000; select deptno,avg(sal) a from emp group by.. elasticsearch查询需要实现类似于mysql的like查询效果,例如值为hello国233的记录,即可以通过查询出记录,也可以通过llo查询出记录。 但是elasticsearch查询都是基于分词查询,hello国233会默认分词为hello、、国、233。当使用hello查询时可以匹配到该记录,但是使用llo查询时,匹配不到该记录。 由于记录内容分词的结果的粒度...
好的,Elasticsearch 模糊查询可以通过使用模糊查询(Fuzzy Query)和通配符查询Wildcard Query)来实现。 1. 模糊查询(Fuzzy Query):模糊查询是指在搜索时根据查询条件的一个词来匹配文档的一个或多个词,而不是完全匹配该查询条件。模糊查询可以通过使用 “fuzzy” 查询实现,例如: GET /my_index/_search "query": { "fuzzy": { "title": { "value": "quick" 在上面的查询,会匹配包含 “quick” 以及类似于 “quack”、“quicker”、“quickest” 等单词的文档。 2. 通配符查询Wildcard Query):通配符查询是指在搜索时使用通配符来匹配文档的一个或多个词。通配符查询可以通过使用 “wildcard查询实现,例如: GET /my_index/_search "query": { "wildcard": { "title": { "value": "qu*" 在上面的查询,会匹配包含以 “qu” 开头的单词的文档,如 “quick”、“quality”、“question” 等。 需要注意的是,使用模糊查询和通配符查询会影响搜索性能,因此在使用时需要谨慎。同时,Elasticsearch 还有其他类型的查询,可以根据具体情况选择使用。