一些不常用的查询
除了之前介绍的几种常用的查询之外,Elasticsearch还提供了很多其他类型的查询,比如:
- Prefix查询:查找以指定前缀开头的字段值。
- Wildcard查询:查找符合指定通配符表达式的字段值。
- Fuzzy查询:查找与指定词语相似的字段值。
- Regexp查询:查找符合指定正则表达式的字段值。
- Ids查询:查找指定ID的文档。
- 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);