1. 程式人生 > >ElasticSearch和spring-data-elasticSearch的結合使用

ElasticSearch和spring-data-elasticSearch的結合使用

 

  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的介面介面名稱的查詢

  關鍵字

關鍵字 使用示例 等同於的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)