ElasticSearch使用spring-data-elasticSearch的用法

 

  spring-data-Elasticsearch 使用以前,必須先肯定版本,elasticsearch 對版本的要求比較高。javascript

  spring和elasticsearch有兩種連接方式,一種是用TCP協議,默認端口是9300,還有一種用http協議。java

  

  用到的註解:正則表達式

  @Document(indexName = "mytest",type = "mytest") //indexName索引名稱,type類別spring

  主鍵可使用@Id 註解 import org.springframework.data.annotation.Idapp

  Jest是使用http請求進行連接的 用elasticsearch 默認的端口9200 進行鏈接elasticsearch

 

  使用Repository的接口接口名稱的查詢函數

  


 方法都有
1.單個保存 save方法可以進行更新操做 若是不傳id,elasticsearch會自動建立id
2.批量保存
3.按照id單個查詢
4.index 方法和save方法相同
 
  
  QueryBuilders 方法介紹
  1. QueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // bool語句的封裝 組合語句 and not or
  2. QueryBuilders.termQuery(null,null); //精確查詢 徹底匹配
  3. QueryBuilders.termsQuery(null,1,2); // 精確查詢 批量匹配
  4. QueryBuilders.matchQuery(null,null); //單個匹配 field不支持通配符, 前綴具高級特性
  5. QueryBuilders.matchAllQuery(); //查詢全部
  6. QueryBuilders.multiMatchQuery("text","",""); //匹配多個字段, field有通配符忒行
  7. QueryBuilders.idsQuery(); //根據id查詢
  8. QueryBuilders.constantScoreQuery(boolQueryBuilder).boost(12.12f); //包裹查詢, 高於設定分數, 不計算相關性
  9. QueryBuilders.disMaxQuery(); // 對子查詢的結果作union, score沿用子查詢score的最大值,
  10. QueryBuilders.fuzzyQuery("",""); //模糊查詢 不能用通配符
  11. QueryBuilders.moreLikeThisQuery(new String[2]); //基於內容的查詢
  12. QueryBuilders.boostingQuery();//它接受一個positive查詢和一個negative查詢。只有匹配了positive查詢的文檔纔會被包含到結果集中,可是同時匹配了negative查詢的文檔會被下降其相關度,經過將文檔本來的_score和negative_boost參數進行相乘來獲得新的_score
  13. QueryBuilders.functionScoreQuery(); //根據權重分查詢
  14. QueryBuilders.rangeQuery(); //範圍查詢
  15. QueryBuilders.spanNearQuery() //跨度查詢
  16. QueryBuilders.wildcardQuery("user", "ki*hy") //通配符查詢
  17. 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。用法以下。ui




@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,查詢的模板是相同的。以下:lua






@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)



QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("name", "Love You");


一個查詢構建器,它容許構建給定JSON字符串或二進制數據做爲輸入的查詢。當您但願使用Java Builder API,但仍然須要將JSON查詢字符串與其餘查詢構建器結合時,這是很是有用的。 wrapperQuery(String source)
添加一些文本以查找「相似」的文檔
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);

相關文章
相關標籤/搜索