gpt4 book ai didi

elasticsearch - 使用 Elasticsearch 忽略前导零

转载 作者:行者123 更新时间:2023-11-29 02:51:27 25 4
gpt4 key购买 nike

我正在尝试创建一个搜索栏,其中最常见的查询是“serviceOrderNo”。 "serviceOrderNo"不是数据库中的数字 字段,它是一个字符串 字段。示例:

000000007
000000002
WO0000042
123456789
AllTextss
000000054
000000065
000000874

最常见的格式只是一个整数加上一些零。

如何设置 Elasticsearch 以便搜索“65”将匹配“000000065”?我还想优先考虑“serviceOrderNo”字段(我已经在使用)。这是我现在所在的位置:

{
"query": {
"multi_match": {
"query": "65",
"fields": ["serviceOrderNo^2", "_all"],
}
}
}

最佳答案

这样做的一种方法是使用 lucene 风格的正则表达式查询:

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html

"query": {
"regexp":{
"serviceOrderNo": "[0]*65"
}
}

此外,查询字符串查询还支持一小组特殊字符,更有限的一组正则表达式字符,以及 lucene 正则表达式查询将如下所示: https://www.elastic.co/guide/en/elasticsearch/reference/1.x/query-dsl-query-string-query.html

"query": {
"query_string": {
"default_field": "serviceOrderNo",
"query": "0*65"
}
}

这些是相当简单的正则表达式,都表示匹配括号 [0] 中包含的字符或字符 0 无限次 *.

如果您有能力重建索引,或者还没有索引您的数据,您还可以通过编写自定义分析器来简化这一过程。现在,您在 serviceOrderNo 字段上使用默认的字符串分析器。当您索引 "serviceOrderNo":"00000065" 时,ES 将其简单解释为 00000065。

您的自定义分析器可以使用相同的正则表达式将此字段标记为“0000065”和“65”。这样做的好处是正则表达式只在索引时运行一次,而不是每次运行查询时运行,因为 ES 将同时搜索“0000065”和“65”。

您还可以查看 the ES website documentation on Analyzers .

"settings":{
"analysis": {
"filter":{
"trimZero": {
"type":"pattern_capture",
"patterns":"^0*([0-9]*$)"
}
},
"analyzer": {
"serviceOrderNo":{
"type":"custom",
"tokenizer":"standard",
"filter":"trimZero"
}
}
}
},
"mappings":{
"serviceorderdto": {
"properties":{
"serviceOrderNo":{
"type":"String",
"analyzer":"serviceOrderNo"
}
}
}
}

关于elasticsearch - 使用 Elasticsearch 忽略前导零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30650384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com