elasticsearch - 弹性搜索 - 应用适当的分析器来获得准确的结果
问题描述
我是弹性搜索的新手。我想应用任何满足以下搜索的分析器。让我们举个例子。假设我在文档中输入了以下文本
- 我现在走路
- 我走到艾哈迈达巴德
- 每天早上我走路
- 阿尼尔在晚上散步。
- 我正在招聘候选人
- 我聘请了候选人
- 我每天都招聘候选人
- 他聘请候选人
现在当我搜索
- 文本“walking”结果应该是 [walking, walk, walk, walks]
- 文本“walked”结果应该是 [walking, walk, walk, walks]
- 文本“walk”的结果应该是 [walking, walk, walk, walks]
- 文本“walks”结果应为 [walking, walk, walk, walks]
同样的结果也应该出租。
- 文本“招聘”结果应该是[招聘,雇用,雇用,雇用]
- 文本“雇用”结果应该是 [雇用,雇用,雇用,雇用]
- 文本“雇用”结果应该是[雇用,雇用,雇用,雇用]
- 文本“雇用”结果应该是[雇用,雇用,雇用,雇用]
谢谢你,
解决方案
您需要使用词干过滤器
词干提取是将单词简化为词根形式的过程。这确保了在搜索期间单词匹配的变体。
例如,walking 和 walk 可以被提取为同一个词根:walk。一旦词干化,任何一个词的出现都会在搜索中与另一个词匹配。
映射
PUT index36
{
"mappings": {
"properties": {
"title":{
"type": "text",
"analyzer": "my_analyzer"
}
}
},
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "whitespace",
"filter": [ "stemmer" ,"lowercase"]
}
}
}
}
}
分析
GET index36/_analyze
{
"text": ["walking", "walked", "walk", "walks"],
"analyzer": "my_analyzer"
}
结果
{
"tokens" : [
{
"token" : "walk",
"start_offset" : 0,
"end_offset" : 7,
"type" : "word",
"position" : 0
},
{
"token" : "walk",
"start_offset" : 8,
"end_offset" : 14,
"type" : "word",
"position" : 101
},
{
"token" : "walk",
"start_offset" : 15,
"end_offset" : 19,
"type" : "word",
"position" : 202
},
{
"token" : "walk",
"start_offset" : 20,
"end_offset" : 25,
"type" : "word",
"position" : 303
}
]
}
所有四个词都产生相同的标记“walk”。所以这些词中的任何一个都会在搜索中匹配另一个。
推荐阅读
- c - 关于 C 中的 fwrite() 错误
- c# - 会话变量在 Asp.net MVC 中丢失
- python - 如何重塑 np 3d 数组中的帧数据?
- python - 缺少主题引擎?
- ios - Firebase - 从常量设置字典中的键时,updateChildValues 使应用程序崩溃
- postgresql - postgresql中的总时间和执行时间之间的差异?
- django - 我们如何在 saleor django 框架中实现 google 登录注册?
- r - 根据条件 (R) 收集变量
- javascript - 如何获取父div的边距顶部?
- css - 如何使下拉菜单正确显示在具有水平滚动条的容器之外