假設我有這樣的映射,并且我想通過“requestId.keyword”欄位進行搜索以獲取完全匹配的請求。如何在不使用 @Query 注釋的情況下使用 Spring Data Elasticsearch 存盤庫實作它?
"requestId": {
"type": "text",
"analyzer": "1_to_15_analyzer_without_space",
"search_analyzer": "all_symbols_and_fold_analyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
uj5u.com熱心網友回復:
這對于通過內省方法名稱來構建查詢的機制是不可能的。第一個想法是有類似的東西(我在Foo這里使用一個物體):
SearchHits<Foo> searchByRequestId_Keyword(String keyword);
方法名稱的分析在 spring-data-common 模塊中完成,該模塊僅使用物體的 Java 屬性的屬性名稱(可能是嵌套的)。但是關鍵字子欄位僅存在于 Elasticsearch 中,并且 - 如果不是自動創建的 - 在@MultiField注釋中。但是決議方法名的代碼不使用特定于存盤的資訊,因此像這樣的方法將無法正常作業,并且會因錯誤而失敗- 這keyword不是textJava 物件的屬性。
您可以做的是首先添加一個自定義存盤庫片段介面:
public interface FooKeywordRepository {
SearchHits<Foo> searchByRequestIdKeyword(String keyword);
}
并提供一個必須以Impl為后綴的介面命名的實作:
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.Query;
public class FooKeywordRepositoryImpl implements FooKeywordRepository {
private final ElasticsearchOperations operations;
public FooKeywordRepositoryImpl(ElasticsearchOperations operations) {
this.operations = operations;
}
@Override
public SearchHits<Foo> searchByRequestIdKeyword(String keyword) {
Query query1 = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.termQuery("requestId.keyword", keyword))
.build();
Query query2 = new CriteriaQuery(Criteria.where("requestId.keyword").is(keyword));
return operations.search(query1, Foo.class); // could be query2 as well
}
}
您有一個ElasticsearchOperations注入并使用它來執行您構建的查詢。我已經用兩種方法來構建查詢,兩者都有效。
您要使用的存盤庫定義將是:
public interface FooRepository extends ElasticsearchRepository<Foo, String>, FooKeywordRepository {
// other custom methods if needed
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/449707.html
