Elasticsearch查询 - 一些不常用的查询

210 阅读2分钟

一些不常用的查询

除了之前介绍的几种常用的查询之外,Elasticsearch还提供了很多其他类型的查询,比如:

  1. Prefix查询:查找以指定前缀开头的字段值。
  2. Wildcard查询:查找符合指定通配符表达式的字段值。
  3. Fuzzy查询:查找与指定词语相似的字段值。
  4. Regexp查询:查找符合指定正则表达式的字段值。
  5. Ids查询:查找指定ID的文档。
  6. Exists查询:查找指定字段存在的文档。

Prefix查询

查询标题以 "Elasticsearch" 开头的文档

jsonCopy code
GET /my_index/_search
{
  "query": {
    "prefix": {
      "title": "Elasticsearch"
    }
  }
}

对应的Java API代码:

QueryBuilder queryBuilder = QueryBuilders.prefixQuery("title", "Elasticsearch");
SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
searchRequest.source(sourceBuilder);

Wildcard查询

查询标题中包含 "elastic" 的文档

jsonCopy code
GET /my_index/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "*elastic*",
        "boost": 1.0
      }
    }
  }
}

对应的Java API代码:

QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("title", "*elastic*");
SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
searchRequest.source(sourceBuilder);

Fuzzy查询

查询用户名与"john"相似的文档:

bashCopy code
GET /my_index/_search
{
  "query": {
    "fuzzy": {
      "username": {
        "value": "john",
        "fuzziness": "2"
      }
    }
  }
}

对应的Java API代码:

SearchRequest searchRequest = new SearchRequest("my_index"); 
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("name", "John").fuzziness("2"); 
searchSourceBuilder.query(fuzzyQueryBuilder); 
searchRequest.source(searchSourceBuilder);

注意:

fuzziness是Elasticsearch中用于模糊匹配的概念。当我们使用一些文本查询时,我们可能会遇到不精确的拼写、词语的多义性或者语言的变体等问题,这时就需要用到Fuzziness来进行模糊匹配。

Fuzziness的作用是在查询时允许一定程度的拼写错误或语言变体,通过将查询词与文档中的词进行比较来寻找相似度高的文档。在Fuzziness的影响下,即使文档中的关键词与查询词拼写不同,也有可能被查询到。

在Elasticsearch中,我们可以通过Fuzziness参数来设置模糊匹配的程度,这个参数表示查询词和文档词之间可以容忍的最大编辑距离。例如,Fuzziness为1表示查询词可以进行一次插入、删除、替换或转置操作以匹配文档中的词。

Fuzziness的使用可以大大提高查询的召回率和准确率,对于拼写错误或语言变体较多的应用场景尤为有效。

Regexp查询

查询标题中以 "elastic" 开头的文档

jsonCopy code
GET /my_index/_search
{
  "query": {
    "regexp": {
      "title": "elastic.*"
    }
  }
}

对应的Java API代码:

javaCopy code
QueryBuilder queryBuilder = QueryBuilders.regexpQuery("title", "elastic.*");
SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

Ids查询

GET /my_index/_search
{
  "query": {
    "ids": {
      "values": ["1", "2"]
    }
  }
}

对应的JavaAPI代码:

SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery().addIds("1", "3", "5");
searchSourceBuilder.query(idsQueryBuilder);
searchRequest.source(searchSourceBuilder);

exists 查询

查询my_index索引中,age字段的值不为null的文档

GET /my_index/_search
{
    "query": {
        "exists" : { "field" : "age" }
    }
}

对应的javaAPI代码:

SearchRequest searchRequest = new SearchRequest("my_index"); 
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery("age");
searchSourceBuilder.query(existsQueryBuilder);
searchRequest.source(searchSourceBuilder);