我正在为我的ElasticSearch索引使用标准分析器,并且我注意到当我在其中搜索带有\1
的查询时-分析器会丢弃%
作为词干分析步骤的一部分(在查询“ 2%牛奶”)
%
响应是以下两个令牌(GET index_name/_analyze
{
"field": "text.english",
"text": "2% milk"
}
和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
符号作为索引中的术语。
有没有一种方法可以配置词干提取器在数字旁边时忽略特殊字符?最糟糕的情况是根本不忽略它?
谢谢!
答案 0 :(得分:0)
您可以通过使用字符过滤器配置自定义分析器来实现所需的行为,该过滤器可以防止“%”字符被剥夺。
查看有关内置分析器配置的Elasticsearch文档,以将该配置用作配置自定义分析器的蓝图(请参见Elasticsearch参考:english analyzer)
添加一个将百分比字符映射到其他字符串的字符过滤器,如以下代码片段所示:
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%
)!
替代解决方案
如果只想删除百分比字符,则可以使用相同的方法,但是只需将%
字符映射到一个空字符串,如以下代码片段所示
"char_filter": {
"my_percent_char_removal_filter": {
"type": "mapping",
"mappings": [
"% => "]
}
}
顺便说一句:这种方法不算是“ hack”,它是在将原始字符串发送到令牌生成器之前修改原始字符串的标准解决方案。