La diferencia entre tipos de texto y palabras clave en ElasticSearch y consulta difusa

Artículos de referencia:
https://blog.csdn.net/sfh2018/article/details/118083634
https://blog.csdn.net/w1014074794/article/details/119643883

Introducción a los tipos de texto y palabras clave.

  • ES5.0 y versiones posteriores cancelan stringtipos y dividen los stringtipos originales en dos tipos: texty . keywordLa diferencia es text会对字段进行分词处理而keyword则不会进行分词.
    Es decir, si el campo es de tipo texto, primero se segmentarán los datos almacenados, y luego las frases segmentadas se almacenarán en el índice, mientras que las palabras clave no se segmentarán y se almacenarán directamente.
  • textLos tipos de datos se utilizan para indexar textos largos, como el cuerpo de un correo electrónico o la introducción de un producto. Estos textos se analizan y segmentan en frases mediante un segmentador de palabras antes de crear el documento de índice. Después del mecanismo de segmentación de palabras, es permite la recuperación de las palabras segmentadas en el texto 但是text类型的数据不能用来过滤、排序和聚合等操作.
  • keywordEste tipo de datos puede cumplir con los requisitos de datos como direcciones de correo electrónico, nombres de host, códigos de estado, códigos postales y etiquetas. No realiza segmentación de palabras y se usa a menudo para filtrar, ordenar y agregar.

¿Cómo hace coincidir elasticsearch con precisión los campos de texto?

Múltiples configuraciones de tipo para el mismo campo

Cree un índice y agregue el alias sin formato al campo de la ciudad a través de la palabra clave de campos en el mapeo. El tipo es palabra clave, que se utiliza para la coincidencia y clasificación exacta.

  • Crear índice
PUT test_index03
{
    
    
  "mappings": {
    
    
    "properties": {
    
    
      "name": {
    
    
        "type": "keyword"
      },
      "city": {
    
    
        "type": "text",
        "fields": {
    
    
          "raw": {
    
    
            "type": "keyword"
          }
        }
      }
    }
  }
}
  • agregando datos
PUT /test_index03/_doc/1
 {
    
    
  "name" : "叶子在这儿",
  "city" : "陕西省西安市长安区"
 }
PUT /test_index03/_doc/2
 {
    
    
   "name":"北京的小家",
   "city":"北京市昌平区回龙观街道"
 }
  • Consulta precisa (use alias para realizar consultas precisas)
GET /test_index03/_search
{
    
    
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
    
          "term": {
    
    
            "city.raw": {
    
    
              "value": "陕西省西安市长安区"
            }
          }
        }
      ]
    }
  },
  "sort": {
    
    
    "city.raw": "asc"
  },
  "aggs": {
    
    
    "Cities": {
    
    
      "terms": {
    
    
        "field": "city.raw"
      }
    }
  }
}

Configuración de múltiples reglas de segmentación de palabras para el mismo campo

Para el texto del campo, el separador de palabras del analizador estándar se usa de forma predeterminada;
cuando el alias inglés se declara a través de campos, se usa el separador de palabras en inglés.

PUT test_index04
{
    
    
  "mappings": {
    
    
    "properties": {
    
    
      "city": {
    
     
        "type": "text",
        "fields": {
    
    
          "english": {
    
     
            "type":     "text",
            "analyzer": "english"
          }
        }
      }
    }
  }
}
  • agregando datos
PUT test_index03/_doc/1
{
    
     "text": "quick brown fox" } 

PUT test_index03/_doc/2
{
    
     "text": "quick brown foxes" } 
  • Preguntar

Utilice la consulta de coincidencia de múltiples campos multi_match para lograr la recuperación de múltiples reglas de segmentación de palabras en un campo.

GET /test_index03/_search
{
    
    
  "query": {
    
    
    "multi_match": {
    
    
      "query": "quick brown foxes",
      "fields": [
        "text",
        "text.english"
      ],
      "type": "most_fields"
    }
  }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43824520/article/details/126860414
Recomendado
Clasificación