因此,无论数字和单位之间是否有空格,我所追求的都是对测量单位进行一致索引。
我使用pattern_capture过滤器完成了这项工作:
GET /_analyze
{
"char_filter": [
{
"pattern": "(\d+)\s*(cm|m|in)",
"type": "pattern_replace",
"replacement": "$1_$2"
}
],
"text": ["10cm", "10 cm"]
}
它产生了我所期望的:
{
"tokens" : [
{
"token" : "10_cm",
"start_offset" : 0,
"end_offset" : 4,
"type" : "word",
"position" : 0
},
{
"token" : "10_cm",
"start_offset" : 5,
"end_offset" : 10,
"type" : "word",
"position" : 101
}
]
}
虽然这是有效的,但我不确定模式捕获的性能。Elasticsearch文档中到处都是Regex警告,我有点担心它可能会对性能造成太大影响。
也许有更好的方法可以更一致地分析这类单位?
您在Elasticsearch中小心性能和正则表达式是正确的
您可以在摄取时使用一个简单的正则表达式。但这取决于您的实现。
主要风险是在索引过程的循环中引入另一个或几个其他循环。因此,在大文本字段上非常危险。但它不应该在您的用例中发生变化。
首先,您应该标记您的regex以避免循环,即使用户发送了错误的数据(10cm、20cm、14cm等…而不是字段内只有一个值可能会有问题(。如果在您的用例中可能的话,请添加^regex$
GET /_analyze
{
"char_filter": [
{
"pattern": "^(\d+)\s*(cm|m|in)$",
"type": "pattern_replace",
"replacement": "$1_$2"
}
],
"text": ["10cm", "10 cm", "a10cm", "10 cm3"]
}
最后两个例子将被忽略。
{
"tokens" : [
{
"token" : "10_cm",
"start_offset" : 0,
"end_offset" : 4,
"type" : "word",
"position" : 0
},
{
"token" : "10_cm",
"start_offset" : 5,
"end_offset" : 10,
"type" : "word",
"position" : 101
},
{
"token" : "a10cm",
"start_offset" : 11,
"end_offset" : 16,
"type" : "word",
"position" : 202
},
{
"token" : "10 cm3",
"start_offset" : 17,
"end_offset" : 23,
"type" : "word",
"position" : 303
}
]
}
但是,真正衡量集群中这种变化的影响的唯一方法是测试它。您可以创建自己的基准,或者使用Rally并定义一个Race来使用大量数据进行测试。