ElasticSearch使用流程
建立索引物件 — 建立對映 — 儲存資料【文件】 — 指定文件型別進行搜尋數
據【文件】
建立索引及對映:— 基於 spring data elasticsearch 註解
在使用 spring data elasticsearch 開發, 需要將索引和對映資訊 配置實體類上面
@Document 文件物件 (索引資訊indexName、文件型別type )
@Document(indexName = “bos”, type = “waybill”)
@Id 文件主鍵 唯一標識
@org.springframework.data.annotation.Id
@Field(index = FieldIndex.not_analyzed, store = true, type = FieldType.Integer)
private Integer id;
@Field 每個文件的欄位配置(型別type、索引是否分詞FieldIndex.analyzed、是否儲存 store 、分詞器analyzer )
@Field(index = FieldIndex.analyzed, analyzer = “ik”, searchAnalyzer = “ik”, store = true, type = FieldType.String)
Spring data Search CRUD 操作
CurdRepository 提供增刪改查 save、delete、findAll 、findOne
PagingAndSortingRepository 提供分頁和排序
ElasticsearchRepository 條件查詢 (分頁)
TermQuery 詞條查詢
WildcardQuery 模糊查詢
FuzzyQuery 相似度查詢
BooleanQuery 布林查詢
must(QueryBuilders) : AND
mustNot(QueryBuilders): NOT
should: : OR
// 情況一:輸入地址是詞條一部分WildcardQueryBuilder("sendAddress", "*" + wayBill.getSendAddress() + "*");
//詞條sendAddressz中包含wayBill.getSendAddress()
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
QueryBuilder queryBuilder1 = new WildcardQueryBuilder("sendAddress", "*" + wayBill.getSendAddress() + "*");
boolQueryBuilder.should(queryBuilder1);
// 情況二:輸入地址是詞條組合,將輸入地址分詞(wayBill.getSendAddress()).field("sendAddress")),取and(.defaultOperator(Operator.AND);)
QueryBuilder queryBuilder2 = new QueryStringQueryBuilder(wayBill.getSendAddress()).field("sendAddress")
.defaultOperator(Operator.AND);
boolQueryBuilder.should(queryBuilder2);
xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">
<!-- 掃描dao包 自動建立實現 -->
<elasticsearch:repositories base-package="cn.itcast.bos.index"/>
<!-- 配置 applicationContext.xml 連線 elasticsearch -->
<!-- 配置elasticsearch連結 -->
<elasticsearch:transport-client id="client" cluster-nodes="127.0.0.1:9300"/>
<!-- spring data elasticsearch DAO 依賴 elasticsearchTemplate -->
<bean id="elasticsearchTemplate"
class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<constructor-arg name="client" ref="client"/>
</bean>
</beans>
queryBuilders常用查詢
package com.wenbronk.javaes;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map.Entry;
import org.elasticsearch.action.ListenableActionFuture;
import org.elasticsearch.action.get.GetRequestBuilder;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.IndicesQueryBuilder;
import org.elasticsearch.index.query.NestedQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.index.query.SpanFirstQueryBuilder;
import org.elasticsearch.index.query.WildcardQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.Before;
import org.junit.Test;
/**
* java操作查詢api
* @author 231
*
*/
public class JavaESQuery {
private TransportClient client;
@Before
public void testBefore() {
Settings settings = Settings.settingsBuilder().put("cluster.name", "wenbronk_escluster").build();
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("192.168.50.37", 9300)));
System.out.println("success to connect escluster");
}
/**
* 使用get查詢
*/
@Test
public void testGet() {
GetRequestBuilder requestBuilder = client.prepareGet("twitter", "tweet", "1");
GetResponse response = requestBuilder.execute().actionGet();
GetResponse getResponse = requestBuilder.get();
ListenableActionFuture<GetResponse> execute = requestBuilder.execute();
System.out.println(response.getSourceAsString());
}
/**
* 使用QueryBuilder
* termQuery("key", obj) 完全匹配
* termsQuery("key", obj1, obj2..) 一次匹配多個值
* matchQuery("key", Obj) 單個匹配, field不支援萬用字元, 字首具高階特性
* multiMatchQuery("text", "field1", "field2"..); 匹配多個欄位, field有萬用字元忒行
* matchAllQuery(); 匹配所有檔案
*/
@Test
public void testQueryBuilder() {
// QueryBuilder queryBuilder = QueryBuilders.termQuery("user", "kimchy");
QueryBUilder queryBuilder = QueryBuilders.termQuery("user", "kimchy", "wenbronk", "vini");
QueryBuilders.termsQuery("user", new ArrayList<String>().add("kimchy"));
// QueryBuilder queryBuilder = QueryBuilders.matchQuery("user", "kimchy");
// QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("kimchy", "user", "message", "gender");
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
searchFunction(queryBuilder);
}
/**
* 組合查詢
* must(QueryBuilders) : AND
* mustNot(QueryBuilders): NOT
* should: : OR
*/
@Test
public void testQueryBuilder2() {
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("user", "kimchy"))
.mustNot(QueryBuilders.termQuery("message", "nihao"))
.should(QueryBuilders.termQuery("gender", "male"));
searchFunction(queryBuilder);
}
/**
* 只查詢一個id的
* QueryBuilders.idsQuery(String...type).ids(Collection<String> ids)
*/
@Test
public void testIdsQuery() {
QueryBuilder queryBuilder = QueryBuilders.idsQuery().ids("1");
searchFunction(queryBuilder);
}
/**
* 包裹查詢, 高於設定分數, 不計算相關性
*/
@Test
public void testConstantScoreQuery() {
QueryBuilder queryBuilder = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("name", "kimchy")).boost(2.0f);
searchFunction(queryBuilder);
// 過濾查詢
// QueryBuilders.constantScoreQuery(FilterBuilders.termQuery("name", "kimchy")).boost(2.0f);
}
/**
* disMax查詢
* 對子查詢的結果做union, score沿用子查詢score的最大值,
* 廣泛用於muti-field查詢
*/
@Test
public void testDisMaxQuery() {
QueryBuilder queryBuilder = QueryBuilders.disMaxQuery()
.add(QueryBuilders.termQuery("user", "kimch")) // 查詢條件
.add(QueryBuilders.termQuery("message", "hello"))
.boost(1.3f)
.tieBreaker(0.7f);
searchFunction(queryBuilder);
}
/**
* 模糊查詢
* 不能用萬用字元, 不知道幹啥用
*/
@Test
public void testFuzzyQuery() {
QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("user", "kimch");
searchFunction(queryBuilder);
}
/**
* 父或子的文件查詢
*/
@Test
public void testChildQuery() {
QueryBuilder queryBuilder = QueryBuilders.hasChildQuery("sonDoc", QueryBuilders.termQuery("name", "vini"));
searchFunction(queryBuilder);
}
/**
* moreLikeThisQuery: 實現基於內容推薦, 支援實現一句話相似文章查詢
* {
"more_like_this" : {
"fields" : ["title", "content"], // 要匹配的欄位, 不填預設_all
"like_text" : "text like this one", // 匹配的文字
}
}
percent_terms_to_match:匹配項(term)的百分比,預設是0.3
min_term_freq:一篇文件中一個詞語至少出現次數,小於這個值的詞將被忽略,預設是2
max_query_terms:一條查詢語句中允許最多查詢詞語的個數,預設是25
stop_words:設定停止詞,匹配時會忽略停止詞
min_doc_freq:一個詞語最少在多少篇文件中出現,小於這個值的詞會將被忽略,預設是無限制
max_doc_freq:一個詞語最多在多少篇文件中出現,大於這個值的詞會將被忽略,預設是無限制
min_word_len:最小的詞語長度,預設是0
max_word_len:最多的詞語長度,預設無限制
boost_terms:設定詞語權重,預設是1
boost:設定查詢權重,預設是1
analyzer:設定使用的分詞器,預設是使用該欄位指定的分詞器
*/
@Test
public void testMoreLikeThisQuery() {
QueryBuilder queryBuilder = QueryBuilders.moreLikeThisQuery("user")
.like("kimchy");
// .minTermFreq(1) //最少出現的次數
// .maxQueryTerms(12); // 最多允許查詢的詞語
searchFunction(queryBuilder);
}
/**
* 字首查詢
*/
@Test
public void testPrefixQuery() {
QueryBuilder queryBuilder = QueryBuilders.matchQuery("user", "kimchy");
searchFunction(queryBuilder);
}
/**
* 查詢解析查詢字串
*/
@Test
public void testQueryString() {
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("+kimchy");
searchFunction(queryBuilder);
}
/**
* 範圍內查詢
*/
public void testRangeQuery() {
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("user")
.from("kimchy")
.to("wenbronk")
.includeLower(true) // 包含上界
.includeUpper(true); // 包含下屆
searchFunction(queryBuilder);
}
/**
* 跨度查詢
*/
@Test
public void testSpanQueries() {
QueryBuilder queryBuilder1 = QueryBuilders.spanFirstQuery(QueryBuilders.spanTermQuery("name", "葫蘆580娃"), 30000); // Max查詢範圍的結束位置
QueryBuilder queryBuilder2 = QueryBuilders.spanNearQuery()
.clause(QueryBuilders.spanTermQuery("name", "葫蘆580娃")) // Span Term Queries
.clause(QueryBuilders.spanTermQuery("name", "葫蘆3812娃"))
.clause(QueryBuilders.spanTermQuery("name", "葫蘆7139娃"))
.slop(30000) // Slop factor
.inOrder(false)
.collectPayloads(false);
// Span Not
QueryBuilder queryBuilder3 = QueryBuilders.spanNotQuery()
.include(QueryBuilders.spanTermQuery("name", "葫蘆580娃"))
.exclude(QueryBuilders.spanTermQuery("home", "山西省太原市2552街道"));
// Span Or
QueryBuilder queryBuilder4 = QueryBuilders.spanOrQuery()
.clause(QueryBuilders.spanTermQuery("name", "葫蘆580娃"))
.clause(QueryBuilders.spanTermQuery("name", "葫蘆3812娃"))
.clause(QueryBuilders.spanTermQuery("name", "葫蘆7139娃"));
// Span Term
QueryBuilder queryBuilder5 = QueryBuilders.spanTermQuery("name", "葫蘆580娃");
}
/**
* 測試子查詢
*/
@Test
public void testTopChildrenQuery() {
QueryBuilders.hasChildQuery("tweet",
QueryBuilders.termQuery("user", "kimchy"))
.scoreMode("max");
}
/**
* 萬用字元查詢, 支援 *
* 匹配任何字元序列, 包括空
* 避免* 開始, 會檢索大量內容造成效率緩慢
*/
@Test
public void testWildCardQuery() {
QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("user", "ki*hy");
searchFunction(queryBuilder);
}
/**
* 巢狀查詢, 內嵌文件查詢
*/
@Test
public void testNestedQuery() {
QueryBuilder queryBuilder = QueryBuilders.nestedQuery("location",
QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("location.lat", 0.962590433140581))
.must(QueryBuilders.rangeQuery("location.lon").lt(36.0000).gt(0.000)))
.scoreMode("total");
}
/**
* 測試索引查詢
*/
@Test
public void testIndicesQueryBuilder () {
QueryBuilder queryBuilder = QueryBuilders.indicesQuery(
QueryBuilders.termQuery("user", "kimchy"), "index1", "index2")
.noMatchQuery(QueryBuilders.termQuery("user", "kimchy"));
}
/**
* 查詢遍歷抽取
* @param queryBuilder
*/
private void searchFunction(QueryBuilder queryBuilder) {
SearchResponse response = client.prepareSearch("twitter")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setScroll(new TimeValue(60000))
.setQuery(queryBuilder)
.setSize(100).execute().actionGet();
while(true) {
response = client.prepareSearchScroll(response.getScrollId())
.setScroll(new TimeValue(60000)).execute().actionGet();
for (SearchHit hit : response.getHits()) {
Iterator<Entry<String, Object>> iterator = hit.getSource().entrySet().iterator();
while(iterator.hasNext()) {
Entry<String, Object> next = iterator.next();
System.out.println(next.getKey() + ": " + next.getValue());
if(response.getHits().hits().length == 0) {
break;
}
}
}
break;
}
// testResponse(response);
}
/**
* 對response結果的分析
* @param response
*/
public void testResponse(SearchResponse response) {
// 命中的記錄數
long totalHits = response.getHits().totalHits();
for (SearchHit searchHit : response.getHits()) {
// 打分
float score = searchHit.getScore();
// 文章id
int id = Integer.parseInt(searchHit.getSource().get("id").toString());
// title
String title = searchHit.getSource().get("title").toString();
// 內容
String content = searchHit.getSource().get("content").toString();
// 文章更新時間
long updatetime = Long.parseLong(searchHit.getSource().get("updatetime").toString());
}
}
/**
* 對結果設定高亮顯示
*/
public void testHighLighted() {
/* 5.0 版本後的高亮設定
* client.#().#().highlighter(hBuilder).execute().actionGet();
HighlightBuilder hBuilder = new HighlightBuilder();
hBuilder.preTags("<h2>");
hBuilder.postTags("</h2>");
hBuilder.field("user"); // 設定高亮顯示的欄位
*/
// 加入查詢中
SearchResponse response = client.prepareSearch("blog")
.setQuery(QueryBuilders.matchAllQuery())
.addHighlightedField("user") // 新增高亮的欄位
.setHighlighterPreTags("<h1>")
.setHighlighterPostTags("</h1>")
.execute().actionGet();
// 遍歷結果, 獲取高亮片段
SearchHits searchHits = response.getHits();
for(SearchHit hit:searchHits){
System.out.println("String方式列印文件搜尋內容:");
System.out.println(hit.getSourceAsString());
System.out.println("Map方式列印高亮內容");
System.out.println(hit.getHighlightFields());
System.out.println("遍歷高亮集合,列印高亮片段:");
Text[] text = hit.getHighlightFields().get("title").getFragments();
for (Text str : text) {
System.out.println(str.string());
}
}
}
}
相關推薦
elasticsearch 5.x 系列之六 文檔索引,更新,查詢,刪除流程
取數 獲取 info ast 負載均衡 blog img 選擇 將在 一、elasticsearch index 索引流程 步驟: 客戶端向Node1 發送索引文檔請求 Node1 根據文檔ID(_id字段)計算出該文檔應該屬於shard0,然後請求路由到Node3的P0分
ElasticSearch最佳入門實踐(七十)優化寫入流程實現海量磁碟檔案合併(segment merge,optimize)
每秒一個segment file,檔案過多,而且每次search都要搜尋所有的segment,很耗時 預設會在後臺執行segment merge操作,在merge的時候,被標記為deleted的document也會被徹底物理刪除 每次merge
ElasticSearch最佳入門實踐(六十九)優化寫入流程實現durability可靠儲存(translog,flush)
(1)資料寫入buffer緩衝和translog日誌檔案 (2)每隔一秒鐘,buffer中的資料被寫入新的segment file,並進入os cache,此時segment被開啟並供search使用 (3)buffer被清空 (4)重複1~3,新的segment不斷新增,buf
ElasticSearch最佳入門實踐(六十八)優化寫入流程實現NRT近實時(filesystem cache,refresh)
現有流程的問題,每次都必須等待fsync將segment刷入磁碟,才能將segment開啟供search使用,這樣的話,從一個document寫入,到它可以被搜尋,可能會超過1分鐘!!!這就不是近實時的搜尋了!!!主要瓶頸在於fsync實際發生磁碟IO寫資料進磁碟,是很耗時的。
java中ElasticSearch搜尋伺服器正常使用執行流程
1,首先建立連線搜尋服務伺服器物件 對於演示應用程式,選擇 Transport Client,並保持 Elasticsearch 執行最低級別的處理: Client client = TransportClient .builder()
zipkin,kafka,elasticsearch整合及其原理流程
大家好,我是瓜哥: 最近公司打算啟用springcloud做微服務架構,微服務開發中鏈路跟蹤是很重要的一環,springcloud中zipkin就實現了鏈路跟蹤的整個功能,zipkin整合中使用到了kafka做鏈路資料收集,elasticsearch做資料儲存和搜尋,下
elasticsearch連線java的開發流程
今天終於爬坑,把elasticsearch連線java測試跑通了,搜尋那麼多,走那麼多彎路,哎!不說了, 自己仔細把走過的路記下來, 讓自己和大家都少走彎路。 1、用maven專案搭建工程: 要注意的是, 你的elasticsearch是什麼版本的, maven下載的那個j
Elasticsearch加入叢集流程
簡介 es節點啟動時,做的最重要的一件事就是加入叢集,今天分析下es節點加入叢集的原始碼。 主要知識點 es基礎 基於lucene的分散式搜尋引擎,不在累述,可以自行查閱資料。 Bully演算法 提到分散式選舉演算法,大家都知道Paxos演算法,但是這個演算法比
elasticsearch的查詢流程分析
我們都知道es是一個分散式的儲存和檢索系統,在儲存的時候預設是根據每條記錄的_id欄位做路由分發的,這意味著es服務端是準確知道每個document分佈在那個shard上的。相對比於CURD上操作,search一個比較複雜的執行模式,因為我們不知道那些document會被匹配
ElasticSearch讀流程
基於版本:2.3.2 這次分析的讀流程指 GET/MGET 過程,不包含搜尋過程。 GET/MGET 必須指定三元組: index type id。 type 可以使用 _all 表示從所有 type 獲取第一個匹配 id 的 doc。 mget 時
ElasticSearch使用流程
建立索引物件 — 建立對映 — 儲存資料【文件】 — 指定文件型別進行搜尋數 據【文件】 建立索引及對映:— 基於 spring data elasticsearch 註解 在使用 spring data elasticsearch 開發,
圖解elasticsearch的寫入流程
####elasticsearch寫入資料時涉及到的核心概念講解: segment file: 儲存倒排索引的檔案,每個segment本質上就是一個倒排索引,每秒都會生成一個segment檔案,當檔案過多時es會自動進行segment merge(合併檔案),
Elasticsearch 學習二(請求流程).
## 一、寫入資料 1、ES 的任意節點都可以作為協調(Coordinating)節點接受請求(包括新建、索引或者刪除請求),每個節點都知道叢集中任一文件位置; 2、協調節點會通過 routing 欄位計算出一個主分片(primary shard),並把請求路由到主分片所在節點(routing 是一個
網站需要備案?對這個流程表示呵呵噠- -快速免備案方法
支持 content lang order borde 惡心 doc 適合 src 對於備案流程,惡心到我了??即將完成的時候,發現真尼瑪麻煩!!!!!菜鳥還沒工作不舍得買好服務器,還是等以後穩定了再備案吧~~ 僅僅適合用於個人網站,且對於搜索引擎不友好,本人主要用於快速訪
elasticsearch index 之 engine
exce query 索引 analyze size public .post blog 存儲 elasticsearch對於索引中的數據操作如讀寫get等接口都封裝在engine中,同時engine還封裝了索引的讀寫控制,如流量、錯誤處理等。engine是離lucene最
elasticSearch 2.3 delete-by-query plugin
type man int each blank eve sin color oca The delete-by-query plugin adds support for deleteing all of the documents which match the spec
SpringMVC請求流程
響應 bsp logs -1 wid 執行 map resp resolve Spring結構圖 SpringMVC請求流程圖 SpringMVC請求流程圖語述: request--->DispatcherServler(中央調度器/前端控制器)--
(轉)web開發流程
ctu 圖片 hit 處理 隨著 使用 一個bug 原型開發 href a、項目經理與公司決策層的溝通,以確定這個需求有沒有足夠的人手和可行性去實現,以及與現有產品的依存關系。 b、公司決策層與市場/策劃部門的交流,這個過程將進行的相當充分,並且是反復、長期的,它致力於
在阿裏雲申請Symantec免費SSL證書操作流程
詳細 二級域名 tle 文件 http aliyun 一段 dns 服務 2016年阿裏雲與國內證書頒發機構天威誠信推出了基於Symantec(賽門鐵克)的免費SSL證書,有需要免費SSL證書產品的可以前往阿裏雲進行申請。 申請地址:阿裏雲雲盾證書服務—Symantec免費
LaTeX-手動安裝宏包(package)以及生成幫助文檔的整套流程
tor hang width 下載地址 ner file href win 7 blog 我使用的是ctex套裝,本來已經自帶了許多package,但是有時候還是需要使用一些沒有預裝的宏包,這時就需要自己安裝package了。下載package可以從CTAN(Compreh