java 如何正确地创建两个可能带有字母前缀的数字的Elasticsearch范围查询?

cunj1qz1  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(91)

我想对两个带通配符前缀的数字之间的范围执行ElasticSearch。例如:
1.用户给出203和899。我想找出203到899之间的所有数字。但是数据库可以在数字前面有一个字符,如A203和B899。我希望结果包括A203和B899之间的范围。
我想Regex我可以做[A-Z]?203,但我不确定它是否能用这种方式计算出值的数值范围?所以总结一下-我的表有数据,如A20322,B3415,C777,856,Y888等。我希望能够找到这些值的范围,同时忽略Character前缀(如果存在):因此,如果我输入C777和856,我想找到777和856之间的所有数字(忽略C前面的字母)。
我知道Elastic search有一个RangeQuery函数,但它似乎接受数字而不是正则表达式。谢谢!
我尝试了RangeQuery,我不认为它返回我想要的结果。我试过:QueryBuilders.rangeQuery(“test”).gte(“[A-Z]?”).lte(“[A-Z]?456”);

42fyovps

42fyovps1#

您可以通过组合通配符查询和范围查询来实现结果:

{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "test.keyword": "[A-Z]?*"
          }
        },
        {
          "range": {
            "test": {
              "gte": 203,
              "lte": 899
            }
          }
        }
      ]
    }
  }
}

在Java SDK中使用:

public class ElasticsearchQueryExample {
    public static void main(String[] args) {
        try (RestHighLevelClient client = new RestHighLevelClient(/* YOUR ELASTIC CLIENT */)) {

            SearchRequest searchRequest = new SearchRequest("your_index_name");
            
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

            // create the wildcard query
            WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("test.keyword", "[A-Z]?*");
            boolQuery.must(wildcardQuery);

            // create the range query
            RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("test").gte(203).lte(899);
            boolQuery.must(rangeQuery);

            // add the query
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(boolQuery);
            searchRequest.source(sourceBuilder);

            // send the request
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

相关问题