ES中如何对text字段进行精确匹配

简介: ES中如何对text字段进行精确匹配

项目场景:


在实际使用ES过程中,经常会遇到这样的问题:

既需要对一个字段进行全文检索,又要对该字段进行等值查询。

我们知道全文检索的字段类型需要设置为text,但是text字段类型又不支持term等值查询。那么怎么解决这个问题呢?

答案是通过fields进行多字段配置


fields说明


为了不同的目的以不同的方式索引相同的字段通常很有用。这就是fields多字段的目的。

例如,一个string 字段可以被映射为一个text类型用于全文搜索的keyword字段,以及一个keyword类型用于等值比较、排序或聚合的字段。


fields主要使用场景:


对一个字段配置多个类型的type以应对不同的查询场景

对一个字段配置多个分词规则以支持多种全文检索规则


官网说明

多字段Multi-fields允许为不同目的以多种方式索引相同的字符串值,例如一个字段用于搜索和一个多字段用于排序和聚合,或者由不同的分析器分析相同的字符串值。


同字段多type配置


1、创建索引,在mapping中通过fields关键字给city字段添加别名raw,类型为keyword,用来做精确匹配以及排序。

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "city": {
        "type": "text",
        "fields": {
          "raw": { 
            "type":  "keyword"
          }
        }
      }
    }
  }
}


2、添加数据

PUT my-index-000001/_doc/1
{
  "city": "New York"
}
PUT my-index-000001/_doc/2
{
  "city": "York"
}


3、查询

通过city.raw使用city的别名raw进行排序

GET my-index-000001/_search
{
  "query": {
    "match": {
      "city": "york" 
    }
  },
  "sort": {
    "city.raw": "asc" 
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.raw" 
      }
    }
  }
}


同字段多分词规则配置


有些场景,我们需要一个字段,满足多套分词规则的检索。


1、新建索引

字段text,默认采用standard analyzer分词器;

通过fields声明别名english,采用english分词器。

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "text": { 
        "type": "text",
        "fields": {
          "english": { 
            "type":     "text",
            "analyzer": "english"
          }
        }
      }
    }
  }
}


2、添加测试数据

PUT my-index-000001/_doc/1
{ "text": "quick brown fox" } 
PUT my-index-000001/_doc/2
{ "text": "quick brown foxes" }


3、查询测试

说明:利用multi_match多字段匹配查询,实现一个字段多种分词规则检索。

GET my-index-000001/_search
{
“query”: {
“multi_match”: {
“query”: “quick brown foxes”,
“fields”: [
“text”,
“text.english”
],
“type”: “most_fields”
}
}
}


总结:


本文主要是介绍了ES中通过fields定义字段别名,实现对text字段进行精准匹配。

1、text字段用来做全文检索,keyword字段用来做等值匹配、排序和聚合运算。

2、怎么通过fields给字段定义别名

3、fields多字段的2种典型运用场景:


1个字段数据需要对应多个type类型

1个字段数据需要满足多种分词匹配规则

目录
相关文章
|
自然语言处理 索引
ES 匹配多个搜索条件和精确查询
ES 匹配多个搜索条件和精确查询
|
分布式计算 监控 搜索推荐
Elasticsearch之SearchScroll原理剖析和优化
Elasticsearch是一款优秀的开源企业级搜索引擎,其查询接口主要为Search接口,提供了丰富的各类查询、排序、统计聚合等功能。本文将要介绍的是另一个查询接口SearchScroll,同时介绍一下我们在这方面做的一些性能和稳定性等方面的优化工作。   Elasticsearch的SearchScroll接口可用于从索引中检索大量数据,或者是所有的数据,值得注意的是Elasti
5346 0
Elasticsearch之SearchScroll原理剖析和优化
|
消息中间件 NoSQL 算法
Redis延时队列,这次彻底给你整明白了
所谓延时队列就是延时的消息队列,下面说一下一些业务场景实践场景订单支付失败,每隔一段时间提醒用户用户并发量的情况,可以延时2分钟给用户发短信先来看看Redis实现普通的消息队列我们知道,对于专业的消息队列中间件,如Kafka和RabbitMQ,消费者在消费消息之前要进行一系列的繁琐过程。如RabbitMQ发消息之前要创建 Exchange,再创建 Queue,还要将 Queue 和 Exchange 通过某种规则绑定起来,发消息的时候要指定 routingkey,还要控制头部信息但是绝大 多数情况下,虽然我们的消息队列只有一组消费者,但还是需要经历上面一些过程。有了 Redis,对于那些只
4529 0
|
SQL JSON 数据格式
ES中如何实现空值和非空值的查询
ES中如何实现空值和非空值的查询
5188 0
|
Java 关系型数据库 BI
ES 中时间日期类型 “yyyy-MM-dd HH:mm:ss” 的完全避坑指南
ES 中时间日期类型 “yyyy-MM-dd HH:mm:ss” 的完全避坑指南
ES 中时间日期类型 “yyyy-MM-dd HH:mm:ss” 的完全避坑指南
Elasticsearch 批量更新
讲述Elasticsearch批量更新索引指定字段操作
|
JSON Java 数据安全/隐私保护
一篇文章讲明白Java第三方支付接入案例(支付宝)
一篇文章讲明白Java第三方支付接入案例(支付宝)
621 0
|
存储 SQL 运维
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
|
IDE 定位技术 开发工具
Mac中IntelliJ IDEA每次打开立刻“意外退出”的解决方法
Mac中IntelliJ IDEA每次打开立刻“意外退出”的解决方法
600 1
|
SQL Java 数据库连接
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法