Un problema encontrado en la búsqueda de segmentación de palabras Ik en ElasticSearch

descripción de la escena

Función de búsqueda de productos de aplicaciones de comercio electrónico

elasticSearch versión: 7.1.17

Los datos del producto se almacenan en un índice llamado bienes

El tipo de nombre_bienes utilizado para buscar es texto, el tokenizador ik está configurado y el modo esik_smart

{
  "mappings": {
    "goods_name": {
      "type": "text",
      "analyzer": "ik_smart"
    }
  }
}
复制代码

El contenido de configuración del diccionario ik es el siguiente:

科颜氏
科颜氏高保湿
复制代码

Ahora hay las siguientes dos líneas de documentos en bienes

bienes_id nombre_bienes
1 crema facial kiehl´s
2 Tónico High Moisturizing Essence de Kiehl's

El programa utiliza palabras clave 科颜氏para buscar, es encuentra el documento cuyo id_bienes es 1 y nombre_bienes es la crema facial de Kiehl's.

En este punto, se espera que llegue a 科颜氏面霜ambos 科颜氏高保湿精粹爽肤水documentos con nombre_mercancías y , pero en realidad solo se llega a una fila.

El programa usa palabras clave 科颜氏高保湿para buscar, es golpea el id_bienes como 2, y el nombre_bienes es el documento de Kiehl's High Moisturizing Essence Toner

análisis del problema

Dado que el modo de segmentación de palabras configurado por nombre_bienes es , y las dos entradas de yik_smart están configuradas en el diccionario ik , los resultados de la segmentación de palabras es del tónico High Moisturizing Essence de Kiehl's son los siguientes:科颜氏科颜氏高保湿

image.png

Se puede ver que debido a que el diccionario está configurado solo con la alta hidratación de Kiehl, no aparece en los resultados de la segmentación de palabras en el modo ik_smart, solo 科颜氏más preciso 科颜氏高保湿, lo que hace que sea imposible encontrar este documento cuando se 科颜氏consulta .

solución

En primer lugar, aclare los requisitos. Mi requisito es encontrar tantos documentos como sea posible al realizar consultas a través de un rango más amplio de palabras clave, y obtener documentos más precisos al realizar consultas a través de un rango más reducido de palabras clave. Entonces, cómo resolver este problema.

Se sabe que ik tiene dos estrategias de segmentación de palabras: ik_smarty ik_max_word, observe el efecto de segmentación de palabras de las dos estrategias

Soy inteligente

menos dividido

image.png

i_max_palabra

Segmentación con máxima granularidad

image.png

可见,在使用 ik_smart 策略时,分词的结果是尽可能小的,而使用 ik_max_word 时,我们可以获得最大粒度也就是尽可能多的拆词结果。

回到我们的需求,我们需要让搜索词命中更多的结果,那么我们需要做两件事情:

  1. 搜索词做最小粒度拆分,即使用 ik_smart 策略,保证 科颜氏 的分词结果是 科颜氏
  2. 索引中的数据做最大粒度拆分,即使用 ik_max_word 策略,让 科颜氏高保湿精粹爽肤水 的分词结果即包含科颜氏,又包含科颜氏高保湿,让此文档尽可能的被命中

后续改进

由于索引中的数据在使用 `ik_max_word ` 策略进行分词后会被做最大粒度的拆分,这也导致当某些搜索词未在字典中进行配置的时候,可能会出现一些低相关的结果,如名称中只是出现了一个一个搜索词中的单字,也被搜索出来了。

为了解决这个问题,可以考虑尽可能的配置完善的字典,也可以考虑排除低得分的文档,这个部分后续进行进一步的学习研究。

Supongo que te gusta

Origin juejin.im/post/7229258224910204989
Recomendado
Clasificación