[英]Range Query on String [Elastic Search]
我有一個具有相同鍵的 JSON object。
這些值可以是字符串或數字(以字符串形式),並在彈性搜索中以相同模式作為文本進行索引
[{
"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 字段。
不使用 object 字段的原因是 elastisearch 將 object 展平,然后對其進行索引。 展平 object 會導致屬性之間的關系丟失。 在此處閱讀更多信息。
現在,考慮以下示例(彈性 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
,其字段為key
、 stringValue
、 numericValue
類型的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
}
]
}
請注意我如何索引字符串值和數值。
第三步:按需查詢。
要查詢嵌套類型字段,您必須使用嵌套查詢。
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。
從許多 Stack-overflow/Github 和其他資源中,它確認此功能不適用於文本。
使用它的唯一方法是在索引時使用相應的數字字段:
[
{ "key" : "foo", "value" : "lisa" },
{ "key" : "bar", "value" : "19", "numericValue" : 19}
]
以及基於數值的索引。 稍后在從 ES 獲取時使用它。
1. match key as "bar"
2. range { "numericValue" : {gt:10}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.