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:科颜氏
科颜氏高保湿
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_smart
y ik_max_word
, observe el efecto de segmentación de palabras de las dos estrategias
Soy inteligente
menos dividido
i_max_palabra
Segmentación con máxima granularidad
可见,在使用 ik_smart
策略时,分词的结果是尽可能小的,而使用 ik_max_word
时,我们可以获得最大粒度也就是尽可能多的拆词结果。
回到我们的需求,我们需要让搜索词命中更多的结果,那么我们需要做两件事情:
- 搜索词做最小粒度拆分,即使用
ik_smart
策略,保证科颜氏
的分词结果是 科颜氏 - 索引中的数据做最大粒度拆分,即使用
ik_max_word
策略,让科颜氏高保湿精粹爽肤水
的分词结果即包含科颜氏,又包含科颜氏高保湿,让此文档尽可能的被命中
后续改进
由于索引中的数据在使用 `ik_max_word
` 策略进行分词后会被做最大粒度的拆分,这也导致当某些搜索词未在字典中进行配置的时候,可能会出现一些低相关的结果,如名称中只是出现了一个一个搜索词中的单字,也被搜索出来了。
为了解决这个问题,可以考虑尽可能的配置完善的字典,也可以考虑排除低得分的文档,这个部分后续进行进一步的学习研究。