簡體   English   中英

字符串范圍查詢[彈性搜索]

[英]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 ,其字段為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
    }
  ]
}

請注意我如何索引字符串值和數值。

第三步:按需查詢。

要查詢嵌套類型字段,您必須使用嵌套查詢

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM