gpt4 book ai didi

elasticsearch - 字符串的范围查询[ Elasticsearch ]

转载 作者:行者123 更新时间:2023-12-02 22:54:02 26 4
gpt4 key购买 nike

我有一个具有相同键的 JSON 对象。

值可以是字符串或数字(以字符串形式),并在 Elastic 搜索中以相同模式作为 文本 进行索引

[{
"key" : "foo",
"value" : "lisa"
}, {
"key" : "bar",
"value" : "19"
}]

我根据以下内容进行比较:

1. match key as "bar"
2. range { "value" : {gt:"10"}}

这并没有发生,因为该值被索引为一个字符串(它应该是)并且由于字符串“2”> 字符串“10”,它失败了 - 这是预期的。

关于如何继续解决这个用例有什么建议吗?

附加信息:

我看到有关在 Elastic Search 7.0+ 中用作 TermRangeQuery 的字符串的文档已删除。

引用:

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

最佳答案

正如您已经遇到的那样,不使用正确数据类型的缺点会导致意外行为。我不明白为什么值可以是数字字符串等。但是考虑到用例,我建议为不同类型的值定义不同的字段。考虑到您尝试匹配的查询,需要维护键和值字段之间的关系。因此,我建议您定义一个嵌套字段而不是普通对象字段。

不使用object field的原因是elastisearch将object展平然后索引。展平对象会导致属性之间关系的丢失。阅读更多相关信息 here .

现在,考虑以下示例(elastic 7.x):

第 1 步:使用正确的字段类型定义映射

PUT test
{
"mappings": {
"properties": {
"nestedField": {
"type": "nested",
"properties": {
"key": {
"type": "keyword"
},
"stringValue": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"numericValue": {
"type": "integer"
}
}
}
}
}
}

我们创建了一个 nestedField,其中包含 keystringValuenumericValue 类型的 keyword(未分析)、text(如果需要精确匹配,则默认标准分析器和类型关键字的子字段)、integer

第 2 步:索引文档

PUT test/_doc/1
{
"nestedField": [
{
"key": "foo",
"stringValue": "lisa"
},
{
"key": "bar",
"numericValue": 19
}
]
}

PUT test/_doc/2
{
"nestedField": [
{
"key": "foo",
"stringValue": "mary"
},
{
"key": "bar",
"numericValue": 9
}
]
}

请注意我是如何索引字符串值和数值的。

第三步:按需查询。

要查询嵌套类型字段,您必须使用 nested query .

GET test/_search
{
"query": {
"nested": {
"path": "nestedField",
"query": {
"bool": {
"filter": [
{
"term": {
"nestedField.key": "bar"
}
},
{
"range": {
"nestedField.numericValue": {
"gt": 10
}
}
}
]
}
}
}
}
}

上面的查询将只返回 doc 1 因为对于 doc 2 即使 key: bar 存在但相关值(numericValue) 不大于 10。

关于elasticsearch - 字符串的范围查询[ Elasticsearch ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61334743/

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