• elasticsearch 单字段多个索引和text字段如何做精确匹配


    项目场景:

    text类型的字段,他的值会被分词,所以无法精确匹配

    在实际使用ES过程中,经常会遇到这样的问题
    既需要对一个字段进行全文检索,又要对该字段进行等值查询。
    我们知道全文检索的字段类型需要设置为text,但是text字段类型又不支持term等值查询。那么怎么解决这个问题呢?
    答案是通过fields进行多字段配置

    fields说明

    为了不同的目的以不同的方式索引相同的字段通常很有用。这就是fields多字段的目的。
    例如,一个string 字段可以被映射为一个text类型用于全文搜索的keyword字段,以及一个keyword类型用于等值比较、排序或聚合的字段。

    fields主要使用场景:

    对一个字段配置多个类型的type以应对不同的查询场景
    对一个字段配置多个分词规则以支持多种全文检索规则
    官网说明
    多字段Multi-fields允许为不同目的以多种方式索引相同的字符串值,例如一个字段用于搜索和一个多字段用于排序和聚合,或者由不同的分析器分析相同的字符串值。

    同字段多type配置

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

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

    添加数据

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

    查询

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

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

    同字段多分词规则配置

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

    新建索引

    字段text,默认采用standard analyzer分词器;
    通过fields声明别名english,采用english分词器。

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

    添加测试数据

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

    查询测试

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

    GET my-index-000001/_search
    {undefined
    “query”: {undefined
    “multi_match”: {undefined
    “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个字段数据需要满足多种分词匹配规则

  • 相关阅读:
    最近ACM刷题见到的没见过的名词
    最近刷题常常遇见的需要百度的知识点
    简单RPG场景实现(改
    简单RPG场景实现
    位图载入与位图移动
    动态菜单
    静态菜单
    双人五子棋
    HDU 2112 HDU Today
    音痴又音痴的LT
  • 原文地址:https://www.cnblogs.com/cfas/p/16143684.html
Copyright © 2020-2023  润新知