7.ElasticSearch(SpringDataElasticSearch)

    ElasticSearch是一個基于Lucene的搜索服務器愤估。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口肴楷。Elasticsearch是用Java開發(fā)的严拒,并作為Apache許可條款下的開放源碼發(fā)布扬绪,是當前流行的企業(yè)級搜索引擎。設計用于云計算中裤唠,能夠達到實時搜索挤牛,穩(wěn)定,可靠种蘸,快速墓赴,安裝使用方便。

    我們建立一個網(wǎng)站或應用程序航瞭,并要添加搜索功能诫硕,但是想要完成搜索工作的創(chuàng)建是非常困難的。我們希望搜索解決方案要運行速度快刊侯,我們希望能有一個零配置和一個完全免費的搜索模式章办,我們希望能夠簡單地使用JSON通過HTTP來索引數(shù)據(jù),我們希望我們的搜索服務器始終可用滨彻,我們希望能夠從一臺開始并擴展到數(shù)百臺藕届,我們要實時搜索,我們要簡單的多租戶亭饵,我們希望建立一個云的解決方案休偶。因此我們利用Elasticsearch來解決所有這些問題及可能出現(xiàn)的更多其它問題。
    cluster
    代表一個集群辜羊,集群中有多個節(jié)點踏兜,其中有一個為主節(jié)點,這個主節(jié)點是可以通過選舉產(chǎn)生的八秃,主從節(jié)點是對于集群內(nèi)部來說的庇麦。es的一個概念就是去中心化,字面上理解就是無中心節(jié)點喜德,這是對于集群外部來說的山橄,因為從外部來看es集群,在邏輯上是個整體舍悯,你與任何一個節(jié)點的通信和與整個es集群通信是等價的.

核心概念:
索引:類似于數(shù)據(jù)表
映射:類似于建表語句 字段名稱航棱、字段類型、字段是否分詞萌衬、是否存儲饮醇、使用什么分詞器
文檔:類似于一行一行的表記錄
文檔類型:方便查詢,把不同的文檔類型放到一個索引里面
1秕豫、導坐標
elasticsearch
spring-data-elasticsearch
2朴艰、實體類customer添加注解
@Entity
@Table(name = "T_WAY_BILL")
@Document(indexName = "vinci", type = "customer")
public class Customer implements Serializable {
@Id
@GeneratedValue
@Column(name = "C_ID")
@org.springframework.data.annotation.Id
@Field(index = FieldIndex.not_analyzed, store = true, type = FieldType.String)
private Integer id;
@Field(index = FieldIndex.analyzed, analyzer = "ik", searchAnalyzer = "ik", store = true, type = FieldType.String)
private String name;
}

3观蓄、配置applicationContext-elasticsearch.xml
  3.1 加約束
  3.2 掃描dao 千萬要注意:操作索引庫的DAO層與操作數(shù)據(jù)庫的DAO層的包要區(qū)分開來,否則會有沖突
  3.3 配置client
  3.4 配置搜索模板(Spring對ElasticSearch的封裝)
    <!-- 2. 搜索DAO 掃描 -->
    <elasticsearch:repositories base-package="com.vinci.index"/>
    <!-- 3. 配置Client -->
    <elasticsearch:transport-client id="client" cluster-nodes="127.0.0.1:9300"/>
    <!-- 4. 配置搜索模板  -->
    <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
        <constructor-arg name="client" ref="client" />
    </bean> 
    
4.查詢
    //根據(jù)詞條精準匹配查詢
    QueryBuilder termQuery = new TermQueryBuilder("customerNum",customer.getcustomerNum());
    //根據(jù)詞條模糊匹配查詢
    QueryBuilder wildcardQuery = new WildcardQueryBuilder("sendAddress", "*" + customer.getSendAddress() + "*");
    //先把查詢內(nèi)容分詞祠墅,再去索引庫比對查詢
    QueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder(customer.getSendAddress()).field("sendAddress").defaultOperator(Operator.AND);
        把查詢內(nèi)容分詞侮穿,然后拿分詞后的詞條和索引庫的詞條比對
        默認Operator.OR   搜索條件中只要有一個詞條和索引庫匹配了,就可以查到
        設置Operator.AND  搜索條件中的所有詞條都要和索引庫匹配毁嗦,才可以查到
    //布爾查詢 亲茅,多條件組合查詢
    BoolQueryBuilder query = new BoolQueryBuilder(); 
 
    理解思路:
    要有面向?qū)ο蟮乃枷耄恳粋€條件封裝成一個對象(Hibernate的QBC查詢狗准、SpringDataJpa的條件查詢)
    頁面上一個參數(shù)克锣,就是一個QueryBuilder
    條件1 a  條件2 b  條件3  c
    1)a and b and c
    BoolQueryBuilder query = new BoolQueryBuilder();
    query.must(a);
    query.must(b);
    query.must(c);    

    2)a or b or c
    query.should(a);
    query.should(b);
    query.should(c);  

    3)a and (b or c)
    BoolQueryBuilder query2 = new BoolQueryBuilder();
    query2.should(b);
    query2.should(c);
    query.must(a);
    query.must(query2);
    
    類比思考:
    select * from mytable where name = xx and  age < 20 and age > 15 and id in (...) and hobby like ""
    where語句一個大條件 Predicate
    子條件是一個具體的Predicate
        BetweenPredicate   age < 20 and age > 15
        LikePredicate      hobby like  ""
        InPredicate        id in (1,2,3)
        
        public Page<customer> findPageData(Customer customer, Pageable pageable) {
            // 判斷customer 中條件是否存在
            if (StringUtils.isBlank(customer.getcustomerNum())
                    && StringUtils.isBlank(customer.getSendAddress())
                    && StringUtils.isBlank(customer.getRecAddress())
                    && StringUtils.isBlank(customer.getSendProNum())
                    && (customer.getSignStatus() == null || customer.getSignStatus() == 0)) { 
                // 無條件查詢 、查詢數(shù)據(jù)庫
                return customerRepository.findAll(pageable);
            } else {
                // 查詢條件
                // must 條件必須成立 and     
                // must not 條件必須不成立 not
                // should 條件可以成立 or
                BoolQueryBuilder query = new BoolQueryBuilder(); // 布爾查詢 腔长,多條件組合查詢
                // 向組合查詢對象添加條件
                if (StringUtils.isNotBlank(customer.getcustomerNum())) {
                    // 運單號查詢
                    QueryBuilder tempQuery = new TermQueryBuilder("customerNum",
                            customer.getcustomerNum());
                    query.must(tempQuery);
                }
                if (StringUtils.isNoneBlank(customer.getSendAddress())) {
                    // 發(fā)貨地 模糊查詢
                    // 情況一: 輸入"北" 是查詢詞條一部分袭祟, 使用模糊匹配詞條查詢
                    QueryBuilder wildcardQuery = new WildcardQueryBuilder(
                            "sendAddress", "*" + customer.getSendAddress() + "*");

                    // 情況二: 輸入"北京市海淀區(qū)" 是多個詞條組合,進行分詞后 每個詞條匹配查詢
                    QueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder(customer.getSendAddress())
                    .field("sendAddress").defaultOperator(Operator.AND);

                    // 兩種情況取or關系
                    BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
                    boolQueryBuilder.should(wildcardQuery);
                    boolQueryBuilder.should(queryStringQueryBuilder);

                    query.must(boolQueryBuilder); 
                }
                if (StringUtils.isNoneBlank(customer.getRecAddress())) {
                    // 收貨地 模糊查詢
                    QueryBuilder wildcardQuery = new WildcardQueryBuilder(
                            "recAddress", "*" + customer.getRecAddress() + "*");  
                    query.must(wildcardQuery);
                }
                if (StringUtils.isNoneBlank(customer.getSendProNum())) {
                    
                    QueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder(customer.getSendProNum())
                    .field("sendProNum").defaultOperator(Operator.AND);
                    query.must(queryStringQueryBuilder);
                }
                if (customer.getSignStatus() != null && customer.getSignStatus() != 0) {
                    // 簽收狀態(tài)查詢
                    QueryBuilder termQuery = new TermQueryBuilder("signStatus",
                            customer.getSignStatus());
                    query.must(termQuery);
                }

                SearchQuery searchQuery = new NativeSearchQuery(query);
                searchQuery.setPageable(pageable); // 分頁效果
                // 有條件查詢 捞附、查詢索引庫
                return customerIndexRepository.search(searchQuery);
            }

        }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巾乳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子故俐,更是在濱河造成了極大的恐慌想鹰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件药版,死亡現(xiàn)場離奇詭異辑舷,居然都是意外死亡,警方通過查閱死者的電腦和手機槽片,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門何缓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人还栓,你說我怎么就攤上這事碌廓。” “怎么了剩盒?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵谷婆,是天一觀的道長。 經(jīng)常有香客問我辽聊,道長纪挎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任跟匆,我火速辦了婚禮异袄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玛臂。我一直安慰自己烤蜕,他們只是感情好封孙,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讽营,像睡著了一般虎忌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斑匪,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天呐籽,我揣著相機與錄音锋勺,去河邊找鬼蚀瘸。 笑死,一個胖子當著我的面吹牛庶橱,可吹牛的內(nèi)容都是我干的贮勃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼苏章,長吁一口氣:“原來是場噩夢啊……” “哼寂嘉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枫绅,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泉孩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后并淋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寓搬,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年县耽,在試婚紗的時候發(fā)現(xiàn)自己被綠了句喷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡兔毙,死狀恐怖唾琼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澎剥,我是刑警寧澤锡溯,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站哑姚,受9級特大地震影響祭饭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜻懦,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一甜癞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宛乃,春花似錦悠咱、人聲如沸蒸辆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躬贡。三九已至,卻和暖如春眼坏,著一層夾襖步出監(jiān)牢的瞬間拂玻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工宰译, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留檐蚜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓沿侈,卻偏偏與公主長得像闯第,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缀拭,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理咳短,服務發(fā)現(xiàn),斷路器蛛淋,智...
    卡卡羅2017閱讀 134,665評論 18 139
  • 歡迎訪問本人博客:http://wangnan.tech Elasticsearch是一個可伸縮的開源全文搜索和分...
    GhostStories閱讀 3,090評論 0 10
  • 我換了一個新的學員隊咙好,換了新的隊干部。我成了班長褐荷,帶了兩個小弟和一個大哥勾效。 成為班長的原意是因為我是老學員(留級生...
    嘴上說不要不要閱讀 65評論 0 0
  • 人生我們會遇見許許多多的“朋友”但是這里有多少是真正的朋友我們可以把豬朋狗友也叫作朋友但是我們遇到困難了真正會幫助...
    8d79327086c8閱讀 313評論 0 0
  • 常常有男人抱怨,我的女人怎么變了诚卸,不再像剛談戀愛時那么溫柔體貼葵第,那么小鳥依人了,是不是被我慣壞了 男人啊合溺,女人被寵...
    娜娜lina閱讀 430評論 0 0