Spring Data访问Elasticsearch----查询方法

一、查询lookup策略

Elasticsearch模块支持所有基本的查询构建功能,如字符串查询、native搜索查询、基于条件的查询和从方法名派生的查询。

1.1 声明的查询

从方法名称派生查询并不总是足够的,并且可能导致方法名称不可读。在这种情况下,可以使用@Query注解(请参见四、使用@Query注解)。

二、创建查询

通常,Elasticsearch的查询创建机制如定义查询方法中描述的那样工作。下面是一个简短的示例,说明了Elasticsearch查询方法的含义:
例1:从方法名创建查询

interface BookRepository extends Repository<Book, String> {
  List<Book> findByNameAndPrice(String name, Integer price);
}

上面的方法名将被转换为下面的Elasticsearch json查询

{
    "query": {
        "bool" : {
            "must" : [
                { "query_string" : { "query" : "?", "fields" : [ "name" ] } },
                { "query_string" : { "query" : "?", "fields" : [ "price" ] } }
            ]
        }
    }
}

Elasticsearch支持的关键字列表如下所示。
表1:方法名称中支持的关键字

关键字 例子 Elasticsearch查询字符串
And findByNameAndPrice { “query” : {“bool” : {“must” : [{ “query_string” : { “query” : “?”, “fields” : [ “name” ] } },{“query_string” : { “query” : “?”, “fields” : [ “price” ] } }]}}}
Or findByNameOrPrice {“query”:{“bool”:{“should”:[{“query_string”:{“query”:“?”,“fields”:[“name”]}},{“query_string”:{“query”:“?”,“fields”:[“price”]}}]}}}
Is findByName {“query”:{“bool”:{“must”:[{“query_string”:{“query”:“?”,“fields”:[“name”]}}]}}}
Not findByNameNot {“query”:{“bool”:{“must_not”:[{“query_string”:{“query”:“?”,“fields”:[“name”]}}]}}}
Between findByPriceBetween {“query”:{“bool”:{“must”:[{“range”:{“price”:{“from”:“?”,“to”:“?”,“include_lower”:true,“include_upper”:true}}}]}}}
LessThan findByPriceLessThan {“query”:{“bool”:{“must”:[{“range”:{“price”:{“from”:null,“to”:“?”,“include_lower”:true,“include_upper”:false}}}]}}}
LessThanEqual findByPriceLessThanEqual {“query”:{“bool”:{“must”:[{“range”:{“price”:{“from”:null,“to”:“?”,“include_lower”:true,“include_upper”:true}}}]}}}
GreaterThan findByPriceGreaterThan {“query”:{“bool”:{“must”:[{“range”:{“price”:{“from”:“?”,“to”:null,“include_lower”:false,“include_upper”:true}}}]}}}
GreaterThanEqual findByPriceGreaterThanEqual {“query”:{“bool”:{“must”:[{“range”:{“price”:{“from”:“?”,“to”:null,“include_lower”:true,“include_upper”:true}}}]}}}
Before findByPriceBefore {“query”:{“bool”:{“must”:[{“range”:{“price”:{“from”:null,“to”:“?”,“include_lower”:true,“include_upper”:true}}}]}}}
After findByPriceAfter {“query”:{“bool”:{“must”:[{“range”:{“price”:{“from”:“?”,“to”:null,“include_lower”:true,“include_upper”:true}}}]}}}
Like findByNameLike {“query”:{“bool”:{“must”:[{“query_string”:{“query”:“?*”,“fields”:[“name”]},“analyze_wildcard”:true}]}}}
StartingWith findByNameStartingWith {“query”:{“bool”:{“must”:[{“query_string”:{“query”:“?*”,“fields”:[“name”]},“analyze_wildcard”:true}]}}}
EndingWith findByNameEndingWith {“query”:{“bool”:{“must”:[{“query_string”:{“query”:“*?”,“fields”:[“name”]},“analyze_wildcard”:true}]}}}
Contains/Containing findByNameContaining {“query”:{“bool”:{“must”:[{“query_string”:{“query”:“?”,“fields”:[“name”]},“analyze_wildcard”:true}]}}}
In (when annotated as FieldType.Keyword) findByNameIn(Collection<String> names) {“query”:{“bool”:{“must”:[{“bool”:{“must”:[{“terms”:{“name”:[“?”,“?”]}}]}}]}}}
In findByNameIn(Collection<String> names) { “query”: {“bool”: {“must”: [{“query_string”:{“query”: “”?" “?”", “fields”: [“name”]}}]}}}
NotIn (when annotated as FieldType.Keyword) findByNameNotIn(Collection<String> names) {“query”:{“bool”:{“must”:[{“bool”:{“must_not”:[{“terms”:{“name”:[“?”,“?”]}}]}}]}}}
NotIn findByNameNotIn(Collectionnames) {“query”: {“bool”: {“must”: [{“query_string”: {“query”: “NOT(”?" “?”)", “fields”: [“name”]}}]}}}
True findByAvailableTrue {“query”:{“bool”:{“must”:[{“query_string”:{“query”:“true”,“fields”:[“available”]}}]}}}
False findByAvailableFalse {“query”:{“bool”:{“must”:[{“query_string”:{“query”:“false”,“fields”:[“available”]}}]}}}
OrderBy findByAvailableTrueOrderByNameDesc {“query”:{“bool”:{“must”:[{“query_string”:{“query”:“true”,“fields”:[“available”]}}]}},“sort”:[{“name”:{“order”:“desc”}}]}
Exists findByNameExists {“query”:{“bool”:{“must”:[{“exists”:{“field”:“name”}}]}}}
IsNull findByNameIsNull {“query”:{“bool”:{“must_not”:[{“exists”:{“field”:“name”}}]}}}
IsNotNull findByNameIsNotNull {“query”:{“bool”:{“must”:[{“exists”:{“field”:“name”}}]}}}
IsEmpty findByNameIsEmpty {“query”:{“bool”:{“must”:[{“bool”:{“must”:[{“exists”:{“field”:“name”}}],“must_not”:[{“wildcard”:{“name”:{“wildcard”:“*”}}}]}}]}}}
IsNotEmpty findByNameIsNotEmpty {“query”:{“bool”:{“must”:[{“wildcard”:{“name”:{“wildcard”:“*”}}}]}}}

不支持使用GeoJson参数构建Geo-shape查询的方法名。如果您需要在存储库中拥有这样的函数,请在自定义存储库实现中使用ElasticsearchOperations和CriteriaQuery。

三、方法返回类型

存储库方法可以定义为具有以下返回类型以返回多个元素:

  • List<T>
  • Stream<T>
  • SearchHits<T>
  • List<SearchHit<T>>
  • Stream<SearchHit<T>>
  • SearchPage<T>

四、使用@Query注解

例2:使用@Query注解在方法上声明query
传递给该方法的参数可以插入到查询字符串中的占位符中。第一个、第二个、第三个参数的占位符形式为?0、?1、?2等。

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("{\"match\": {\"name\": {\"query\": \"?0\"}}}")
    Page<Book> findByName(String name,Pageable pageable);
}

设置为注解参数的String必须是一个有效的Elasticsearch JSON查询。它将作为查询元素的值发送给Elasticsearch;例如,如果使用参数John调用函数,它将产生以下查询体:

{
  "query": {
    "match": {
      "name": {
        "query": "John"
      }
    }
  }
}

例3:使用Collection参数的方法上的@Query注解

@Query("{\"ids\": {\"values\": ?0 }}")
List<SampleEntity> getByIds(Collection<String> ids);

像上面这样的存储库方法将进行ID查询以返回所有匹配的文档。因此,调用List为[“id1”、“id2”、“id3”]的方法将生成查询体

{
  "query": {
    "ids": {
      "values": ["id1", "id2", "id3"]
    }
  }
}

相关推荐

  1. Spring Data访问Elasticsearch----查询方法

    2024-03-20 19:52:02       24 阅读
  2. ElasticSearch 常用查询优化方式

    2024-03-20 19:52:02       11 阅读
  3. elasticsearch查询

    2024-03-20 19:52:02       33 阅读
  4. Elasticsearch 查询超过10000 的解决方案 - Python

    2024-03-20 19:52:02       38 阅读
  5. Python访问ElasticSearch

    2024-03-20 19:52:02       38 阅读
  6. RESTfull接口访问Elasticsearch

    2024-03-20 19:52:02       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 19:52:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 19:52:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 19:52:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 19:52:02       20 阅读

热门阅读

  1. 了解比特币分叉:演变与分歧

    2024-03-20 19:52:02       19 阅读
  2. Docker 命令大全

    2024-03-20 19:52:02       19 阅读
  3. LeetCode204. Count Primes

    2024-03-20 19:52:02       22 阅读
  4. 描述一下使用过的任何安全测试工具及其功能

    2024-03-20 19:52:02       24 阅读
  5. 分布式事务的实现方式

    2024-03-20 19:52:02       23 阅读
  6. C++ 函数模板

    2024-03-20 19:52:02       20 阅读
  7. 机器学习模型—K means

    2024-03-20 19:52:02       20 阅读