字符串范围查询[Elastic Search]



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

这些值可以是字符串或数字(以字符串形式(,并以弹性搜索中的相同模式作为文本进行索引

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

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

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

这种情况不会发生,因为值被索引为字符串(它应该是(,并且由于string"2">string"10",它的失败是意料之中的。

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

附加信息

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

参考

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

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

不使用对象字段的原因是弹性体先将对象展平,然后对其进行索引。展平对象会导致属性之间的关系丢失。点击此处了解更多信息。

现在,考虑以下示例(弹性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
}
]
}

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

步骤3:根据需要进行查询。

若要查询嵌套类型字段,必须使用嵌套查询。

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。

从许多堆栈溢出/Github和其他资源中,它确认此功能不适用于文本。

使用它的唯一方法是在索引时具有相应的数字字段:

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

以及基于数值的索引。稍后在从ES.获取时使用此选项

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

最新更新