在弹性搜索中搜索字符串内的数字范围

时间:2015-06-01 08:57:21

标签: lucene elasticsearch

我想在弹性搜索中搜索数值表达式。

实施例

indent code 4.8663 spaces
indent code 121.232 spaces
indent code 12.3232 spaces

示例查询

get all string with "indent code between 1 and 100"

它应该获得第1和第3但不是第2。

                    {
                        "span_near": {
                            "in_order": 1,
                            "clauses": [
                                {
                                    "span_term": {
                                        "request": "indent"
                                    }
                                },
                                {
                                    "span_term": {
                                        "request": "code"
                                    }
                                }
                                ,
                                {
                                    "span_multi": {
                                            "match":{
                                                "range": {
                                                    "request": {
                                                        "to": 100,
                                                        "from": 1
                                                    }
                                                }
                                        }
                                    }
                                }
                            ],
                            "slop": 0,
                            "collect_payloads": 0
                        }
                    }

给出错误的结果。因为它是使用TermRangeQuery而不是NumericRangeQuery进行比较。

1 个答案:

答案 0 :(得分:0)

如果您可以用整数(4.8663 => 5)替换浮点数或将浮点数乘以10的选定幂,以便所有数字都变为整数(4.8663 => 48663),那么您可以使用regexp query进行此操作。

我已经使用整数(5,121和12)索引了三个文档,并且我已经能够使用以下查询在1-100区间内成功检索这两个文档。

{
  "query": {
    "regexp": {
      "request": {
        "value": "<1-100>"
      }
    }
  }
}

如果您出于其他原因绝对需要保持精确度,那么这可能不适合您。