【问题标题】:How to create wildcard query with Elasticsearch Java API?如何使用 Elasticsearch Java API 创建通配符查询?
【发布时间】:2020-07-24 17:38:51
【问题描述】:

如何使用 Elasticsearch 创建通配符查询?我尝试了以下方法,但我认为它不起作用(我的意思是它没有过滤)。

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.wildcardQuery("message", "ANG*"));

我也尝试了 prefixQuery 方法,但它也没有过滤任何结果。

boolQueryBuilder.must(QueryBuilders.prefixQuery("message", "ANG"));

编辑:

        "_index": "log4j_2017",
        "_type": "log4j",
        "_id": "fd23123122",
        "_score": null,
        "_source": {
           "date": "2017-03-10T19:04:50.049Z",
           "contextStack": [],
           "level": "INFO",
           "marker": null,
           "thrown": null,
           "message": "ANGServlet 'spring': initialization completed in 2314 ms",
           "millis": 1489151090049,
           "contextMap": {},
           "threadName": "http-apr-8080-exec-77"
         }

【问题讨论】:

  • 你能分享你的地图吗?
  • 我正在使用 log4j,我认为它没有任何映射。(我认为是动态映射)
  • 运行curl -XGET localhost:9200/your_index时你会得到什么?
  • @Val 我无权访问 es 服务器。我只能发送 HTTP 请求。

标签: elasticsearch


【解决方案1】:

一个可能的原因是你 message 字段被分析了,并且在这种情况下标记是小写的,所以你需要这样搜索:

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.wildcardQuery("message", "ang*"));

boolQueryBuilder.must(QueryBuilders.prefixQuery("message", "ang"));

【讨论】:

  • 是的,当我使用小写字母时它起作用了。我想我需要创建一个新的映射。感谢您的帮助。
  • 太棒了,很高兴它有帮助!
  • 我们如何构建通配符查询以匹配 java 中的多个术语?
  • @RameshPapaganti 随时根据您的确切需求创建一个新问题
【解决方案2】:

在java中的布尔查询中添加多个通配符

SearchRequest searchRequest = new SearchRequest(Constant.ELASTIC_ROOM_INDEX);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.wildcardQuery("roomNo", "*" + searchText + "*")).boost(2);
boolQueryBuilder.should(QueryBuilders.wildcardQuery("location", "*" + searchText + "*")).boost(1);
searchSourceBuilder.query(QueryBuilders.boolQuery().must(boolQueryBuilder));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit hit : searchHits) {
    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
    Long roomId = ((Integer) sourceAsMap.get("roomId")).longValue();
    String roomNo = (String) sourceAsMap.get("roomNo");
    String location = (String) sourceAsMap.get("location");
    results.add(new SearchResultDTO(roomNo + ", " + location + ",Room", roomId));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多