spring-data-Elasticsearch 使用之前,必須先確定版本,elasticsearch 對版本的要求比較高。
spring和elasticsearch有兩種鏈接方式,一種是用TCP協議,默認端口是9300,還有一種用http協議。
用到的注解:
@Document(indexName = "mytest",type = "mytest") //indexName索引名稱,type類別
主鍵可以使用@Id 注解 import org.springframework.data.annotation.Id
Jest是使用http請求進行鏈接的 用elasticsearch 默認的端口9200 進行連接
使用Repository的接口接口名稱的查詢
方法都有
1.單個保存 save方法能夠進行更新操作 如果不傳id,elasticsearch會自動創建id
2.批量保存
3.按照id單個查詢
4.index 方法和save方法相同
QueryBuilders 方法介紹
- QueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // bool語句的封裝 組合語句 and not or
- QueryBuilders.termQuery(null,null); //精確查詢 完全匹配
- QueryBuilders.termsQuery(null,1,2); // 精確查詢 批量匹配
- QueryBuilders.matchQuery(null,null); //單個匹配 field不支持通配符, 前綴具高級特性
- QueryBuilders.matchAllQuery(); //查詢所有
- QueryBuilders.multiMatchQuery("text","",""); //匹配多個字段, field有通配符忒行
- QueryBuilders.idsQuery(); //根據id查詢
- QueryBuilders.constantScoreQuery(boolQueryBuilder).boost(12.12f); //包裹查詢, 高於設定分數, 不計算相關性
- QueryBuilders.disMaxQuery(); // 對子查詢的結果做union, score沿用子查詢score的最大值,
- QueryBuilders.fuzzyQuery("",""); //模糊查詢 不能用通配符
- QueryBuilders.moreLikeThisQuery(new String[2]); //基於內容的查詢
- QueryBuilders.boostingQuery();//它接受一個positive查詢和一個negative查詢。只有匹配了positive查詢的文檔才會被包含到結果集中,但是同時匹配了negative查詢的文檔會被降低其相關度,通過將文檔原本的_score和negative_boost參數進行相乘來得到新的_score
- QueryBuilders.functionScoreQuery(); //根據權重分查詢
- QueryBuilders.rangeQuery(); //范圍查詢
- QueryBuilders.spanNearQuery() //跨度查詢
- QueryBuilders.wildcardQuery("user", "ki*hy") //通配符查詢
- QueryBuilders.nestedQuery() //嵌套查詢
關鍵字
關鍵字 | 使用示例 | 等同於的ES查詢 |
---|---|---|
And | findByNameAndPrice | {“bool” : {“must” : [ {“field” : {“name” : “?”}}, {“field” : {“price” : “?”}} ]}} |
Or | findByNameOrPrice | {“bool” : {“should” : [ {“field” : {“name” : “?”}}, {“field” : {“price” : “?”}} ]}} |
Is | findByName | {“bool” : {“must” : {“field” : {“name” : “?”}}}} |
Not | findByNameNot | {“bool” : {“must_not” : {“field” : {“name” : “?”}}}} |
Between | findByPriceBetween | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,”to” : ?,”include_lower” : true,”include_upper” : true}}}}} |
LessThanEqual | findByPriceLessThan | {“bool” : {“must” : {“range” : {“price” : {“from” : null,”to” : ?,”include_lower” : true,”include_upper” : true}}}}} |
GreaterThanEqual | findByPriceGreaterThan | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,”to” : null,”include_lower” : true,”include_upper” : true}}}}} |
Before | findByPriceBefore | {“bool” : {“must” : {“range” : {“price” : {“from” : null,”to” : ?,”include_lower” : true,”include_upper” : true}}}}} |
After | findByPriceAfter | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,”to” : null,”include_lower” : true,”include_upper” : true}}}}} |
Like | findByNameLike | {“bool” : {“must” : {“field” : {“name” : {“query” : “? *”,”analyze_wildcard” : true}}}}} |
StartingWith | findByNameStartingWith | {“bool” : {“must” : {“field” : {“name” : {“query” : “? *”,”analyze_wildcard” : true}}}}} |
EndingWith | findByNameEndingWith | {“bool” : {“must” : {“field” : {“name” : {“query” : “*?”,”analyze_wildcard” : true}}}}} |
Contains/Containing | findByNameContaining | {“bool” : {“must” : {“field” : {“name” : {“query” : “?”,”analyze_wildcard” : true}}}}} |
In | findByNameIn(Collectionnames) | {“bool” : {“must” : {“bool” : {“should” : [ {“field” : {“name” : “?”}}, {“field” : {“name” : “?”}} ]}}}} |
NotIn | findByNameNotIn(Collectionnames) | {“bool” : {“must_not” : {“bool” : {“should” : {“field” : {“name” : “?”}}}}}} |
True | findByAvailableTrue | {“bool” : {“must” : {“field” : {“available” : true}}}} |
False | findByAvailableFalse | {“bool” : {“must” : {“field” : {“available” : false}}}} |
OrderBy | findByAvailableTrueOrderByNameDesc | {“sort” : [{ “name” : {“order” : “desc”} }],”bool” : {“must” : {“field” : {“available” : true}}}} |
模板的使用
1.增加
IndexQuery的作用是保存對象到elasticsearch。用法如下。
@Autowired
private ElasticsearchTemplate elasticsearchTemplate; Book book = new Book("《西游記后傳》", "小白龍", 100); IndexQuery indexQuery = new IndexQueryBuilder() .withIndexName("library") .withType("book") .withId(book.getId()+"") .withObject(book) //對象或集合 .build(); elasticsearchTemplate.index(indexQuery);
2.刪除
//第一種刪除具體的一條記錄 elasticsearchTemplate.delete("library","book",100+""); //第二種刪除indexName/type/下的所有 DeleteQuery deleteQuery = new DeleteQuery(); deleteQuery.setIndex("library"); deleteQuery.setType("book"); elasticsearchTemplate.delete(deleteQuery); //第三種刪除indexName/下的所有 elasticsearchTemplate.deleteIndex("library"); //第四種刪除查詢出來的所有 deleteQuery = new DeleteQuery(); deleteQuery.setQuery(QueryBuilders.matchQuery("id","100")); elasticsearchTemplate.delete(deleteQuery);
3.更新
Book book = new Book("《西游記后傳》", "豬八戒", 100); UpdateQuery updateQuery = new UpdateQueryBuilder() .withIndexName("library") .withType("book") .withId(book.getId()+"") .build(); elasticsearchTemplate.update(updateQuery);
4.查詢
查詢不同於前面幾個,查詢比較復雜,比如模糊查詢,組合查詢,准確查詢等。這些變化來源於不同的QueryBuilder
,查詢的模板是相同的。如下:
@Autowired
private ElasticsearchTemplate elasticsearchTemplate; Sort sort = new Sort(Sort.Direction.DESC, "id");//以id值為准 降序排列,ASC為升序 Pageable pageable = new PageRequest(0, 10, sort);//查看第0頁,以每頁10條划分 SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchAllQuery()) // 自定義查詢(這是不同的地方) .withPageable(pageable) // 自定義分頁 .build(); Page<Book> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery,Book.class); System.out.println("頁數" + sampleEntities.getTotalPages()); System.out.println("行數" + sampleEntities.getTotalElements()); System.out.println("大小" + sampleEntities.getSize()); System.out.println("當前第幾頁" + sampleEntities.getNumber()); System.out.println("當前頁的數量"+sampleEntities.getNumberOfElements()); System.out.println("List<Book>:"+sampleEntities.getContent());
匹配所有文檔的查詢。
matchAllQuery()
為提供的字段名和文本創建類型為“BOOLEAN”的匹配查詢。(解釋過來就是單個匹配,可以模糊匹配)
matchQuery(String name, Object text) //name 字段值 ,text 查詢文本(不支持通配符)
為提供的字段名和文本創建一個通用查詢。
commonTermsQuery(String name, Object text)
為提供的字段名和文本創建類型為“BOOLEAN”的匹配查詢。 multiMatchQuery(Object text, String... fieldNames)
為提供的字段名和文本創建一個文本查詢,並輸入“短句”。
matchPhraseQuery(String name, Object text)
為提供的字段名和文本創建一個與類型“PHRASE_PREFIX”匹配的查詢。
matchPhrasePrefixQuery(String name, Object text)
匹配包含術語的文檔的查詢。
termQuery(String name, Object value)
使用模糊查詢匹配文檔的查詢
fuzzyQuery(String name, Object value)
與包含指定前綴的術語的文檔相匹配的查詢。
prefixQuery(String name, String prefix)
在一定范圍內匹配文檔的查詢。
rangeQuery(String name)
實現通配符搜索查詢。支持的通配符是*,它匹配任何字符序列(包括空字符),而?它匹配任何單個字符。注意,這個查詢可能很慢,因為它需要遍歷許多項。為了防止異常緩慢的通配符查詢,通配符項不應該以一個通配符*或?開頭。
wildcardQuery(String name, String query) //query 通配符查詢字符串
將包含術語的文檔與指定的正則表達式匹配的查詢
regexpQuery(String name, String regexp) //regexp的正則表達式
解析查詢字符串並運行它的查詢。有兩種模式。第一,當沒有字段添加(使用QueryStringQueryBuilder.field(字符串),將運行查詢一次,非前綴字段將使用QueryStringQueryBuilder.defaultField(字符串)。第二,當一個或多個字段添加(使用QueryStringQueryBuilder.field(String)),將運行提供的解析查詢字段,並結合使用DisMax或普通的布爾查詢(參見QueryStringQueryBuilder.useDisMax(布爾))。 queryStringQuery(String queryString)
類似於query_string查詢的查詢,但不會為任何奇怪的字符串語法拋出異常。
simpleQueryStringQuery(String queryString)
可以使用BoostingQuery類來有效地降級與給定查詢匹配的結果。 boostingQuery()
匹配與其他查詢的布爾組合匹配的文檔的查詢
boolQuery()
創建一個可用於實現MultiTermQueryBuilder的子查詢的SpanQueryBuilder。 spanMultiTermQueryBuilder(MultiTermQueryBuilder multiTermQueryBuilder)
允許定義自定義得分函數的查詢。
functionScoreQuery(QueryBuilder queryBuilder, ScoreFunctionBuilder function)
更像這樣的查詢,查找“like”提供的文檔,例如提供的MoreLikeThisQueryBuilder.likeText(String),它是針對查詢所構造的字段進行檢查的 moreLikeThisQuery(String... fields)
構造一個新的非計分子查詢,包含子類型和要在子文檔上運行的查詢。這個查詢的結果是這些子文檔匹配的父文檔。
hasChildQuery(String type, QueryBuilder query)
構造一個新的非評分父查詢,父類型和在父文檔上運行的查詢。這個查詢的結果是父文檔匹配的子文檔。
hasParentQuery(String type, QueryBuilder query)
基於對其中任何一個項進行匹配的若干項的字段文件
termsQuery(String name, String... values)
一個查詢構建器,它允許構建給定JSON字符串或二進制數據作為輸入的查詢。當您希望使用Java Builder API,但仍然需要將JSON查詢字符串與其他查詢構建器結合時,這是非常有用的。 wrapperQuery(String source)
QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("name", "Love You");
添加一些文本以查找“類似”的文檔
addLikeText(String... likeTexts)
查找類似文檔
like(Item... likeItems)
設置不從其中選擇(比如我們調用.like("西游").unlike("西游記")這樣會導致啥也查不到) unlike(String... unlikeTexts)
添加一些文本以查找與此不同的文檔
addUnlikeText(String... unlikeTexts)
設置將包含在任何生成查詢中的查詢條件的最大數量。默認25 maxQueryTerms(int maxQueryTerms)
設置單詞被忽略的頻率,默認5,小於將不會被發現 minDocFreq(int minDocFreq)
設置單詞仍然出現的最大頻率。單詞出現更多的文檔將被忽略。默認為無限
maxDocFreq(int maxDocFreq)
設置將被忽略的單詞的最小單詞長度,默認0 minWordLength(int minWordLength)
設置將被忽略的單詞的最大單詞長度,默認無限
maxWordLength(int maxWordLength)
設置停止詞,匹配時會忽略停止詞
stopWords(String... stopWords)
設置詞語權重,默認是1 boostTerms(float boostTerms)
查詢權重(默認1) boost(float boost)
設置不從其中選擇術語的文本(文檔Item) ignoreLike(String... likeText)
使用elasticsearchTemplate的java代碼
term是代表完全匹配,也就是精確查詢,搜索前不會再對搜索詞進行分詞,所以我們的搜索詞必須是文檔分詞集合中的一個
TermsBuilder:構造聚合函數
AggregationBuilders:創建聚合函數工具類
BoolQueryBuilder:拼裝連接(查詢)條件
QueryBuilders:簡單的靜態工廠”導入靜態”使用。主要作用是查詢條件(關系),如區間\精確\多值等條件
NativeSearchQueryBuilder:將連接條件和聚合函數等組合
SearchQuery:生成查詢
elasticsearchTemplate.query:進行查詢
Aggregations:Represents a set of computed addAggregation.代表一組添加聚合函數統計后的數據
Bucket:滿足某個條件(聚合)的文檔集合
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery()).build();
return elasticsearchTemplate.queryForList(searchQuery, Product.class);