elasticsearch - ElasticSearch - 从标准词干分析器中排除特殊字符
问题描述
我正在为我的 ElasticSearch 索引使用标准分析器,我注意到当我在其中搜索查询时- 分析器将作为词干分析器步骤的一部分%
删除(在查询“2% milk”上)%
GET index_name/_analyze
{
"field": "text.english",
"text": "2% milk"
}
响应是以下 2 个标记(2
和milk
):
{
"tokens": [
{
"token": "2",
"start_offset": 0,
"end_offset": 1,
"type": "<NUM>",
"position": 0
},
{
"token": "milk",
"start_offset": 3,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 1
}
]
}
意思是,2%
变成2
我想使用标准词干分析器来减少标点符号,我不想使用空格词干分析器或其他不标准的词干分析器,但我确实想<number>%
在索引中使用符号作为术语。
有没有办法将词干分析器配置为在数字旁边忽略特殊字符?最坏的情况根本不忽略它?
谢谢!
解决方案
您可以通过使用字符过滤器配置自定义分析器来实现所需的行为,该过滤器可防止“%”字符被剥离。
查看有关内置分析器配置的 Elasticsearch 文档,以将该配置用作配置自定义分析器的蓝图(请参阅 Elasticsearch 参考:英语分析器)
添加一个字符过滤器,将百分比字符映射到不同的字符串,如以下代码片段所示:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"my_percent_char_filter"
]
}
},
"char_filter": {
"my_percent_char_filter": {
"type": "mapping",
"mappings": [
"0% => 0_percent",
"1% => 1_percent",
"2% => 2_percent",
"3% => 3_percent",
"4% => 4_percent",
"5% => 5_percent",
"6% => 6_percent",
"7% => 7_percent",
"8% => 8_percent",
"9% => 9_percent"
]
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_analyzer",
"text": "The fee is between 0.93% or 2%"
}
有了这个,您甚至可以搜索特定的百分比(如2%
)!
替代解决方案
如果您只是想删除百分比字符,您可以使用完全相同的方法,但只需将%
-character 映射为空字符串,如以下代码片段所示
"char_filter": {
"my_percent_char_removal_filter": {
"type": "mapping",
"mappings": [
"% => "]
}
}
顺便说一句:这种方法不被认为是“hack”,它是在将原始字符串发送到标记器之前修改原始字符串的标准解决方案方法。
推荐阅读
- bash - 如何对使用各种约定编号的文件名进行排序
- javascript - 类型 'void' 不可分配给类型 '((event: MouseEvent
) => 无效) | 不明确的' - python - 对 Steam 的 HTTP 请求给出 401 响应
- django - 将对象属性总和添加到 Django Rest 框架响应
- office365 - Word 加载项清单文件 - 任务窗格 URL 不接受 MVC
- android - Android 单元测试在 android studio 中永远运行
- android - 从对象数组中删除重复项
- android - react native 开发服务器返回响应错误码500
- google-apps-script - Google App Script - 将静态图表复制到另一个电子表格
- c# - C# - 将对象与代码生成的图像相交