Elasticsearch索引度量单位,无论是否有空格



因此,无论数字和单位之间是否有空格,我所追求的都是对测量单位进行一致索引。

我使用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来使用大量数据进行测试。

最新更新