我想在elasticsearch中指定每个字段分析器。对于某些字段,我需要关键字分析器,而对于一个字段,我需要一个自定义数字分析器,它将删除所有非数字字符(请参阅下面代码中的number_analyzer
)
创建索引的请求是
{
"settings": {
"analysis" : {
"analyzer" : {
"number_analyzer" : {
"type": "custom",
"tokenizer": "keyword",
"filter": ["lowercase"],
"char_filter": ["number_filter"]
}
},
"char_filter" : {
"number_filter" : {
"type": "pattern_replace",
"pattern": "[\\d]+",
"replacement": ""
}
}
}
}
}
字段的映射是
{
"properties": {
"field1": {
"type": "string",
"store": "yes",
"index": "analyzed",
"analyzer": "number_analyzer"
},
"field2": {
"type": "string",
"store": "yes",
"index": "not_analyzed",
"analyzer": "keyword"
},
"field3": {
"type": "string",
"store": "true",
"index": "not_analyzed"
},
"field4": {
"type": "string",
"store": "yes",
"index": "analyzed"
},
"field5": {
"type": "string",
"store": "yes",
"index": "analyzed",
"analyzer": "number_analyzer"
}
}
}
当我在索引
中插入以下文档时{
"field1" : "464533AB",
"field2" : "Euro",
"field3" : "THIS IS A TITLE",
"field4": "DEED_TYPE",
"field5":"TEST3"
}
我注意到field1中的字符未被删除(我的目标是仅保留464533
),而且我能够获得查询field4:DEED_TYPE
的结果,尽管我不应该这样做。 t(我认为标准分析器会删除特殊字符并执行小写,因此我希望field4:DEED_TYPE
只能使用关键字分析器。)
上述代码中分析器的指定方式是否有任何错误?
答案 0 :(得分:0)
通常,在查询时应用相同的分析规则,如在索引时应用的那样。所以当你搜索:
field4:"DEED_TYPE"
将分析该查询,并变为:
field4:"deed type"
同样,分析不会影响字段的存储版本,我相信这是你在field1中引用的。存储的字段版本,即从索引中检索的版本作为搜索结果。因此,即使在分析中删除了字母,也只会反映在您搜索数据的方式上。如果您想要更改字段的存储表示,那么应该在进行lucene分析之前进行预处理。分析仪通常不是用于此的工具。
你的number_filter虽然错了,但你还是倒退了。应该是:
"number_filter" : {
"type": "pattern_replace",
"pattern": "[^\\d]+",
"replacement": ""
}
[\\d]+
匹配所有数字。根据您的描述,您希望删除除数字之外的所有内容,因此[^\\d]+