1. 程式人生 > >ElasticSearch使用流程

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