spring-data-elasticsearch 實(shí)例

拋開原生的操作,這里我們采用spring提供的框架進(jìn)行操作吨艇,會(huì)是操作方便不少。

maven引用

    <spring-data-elasticsearch.version>2.0.6.RELEASE</spring-data-elasticsearch.version>
        

       <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>${spring-data-elasticsearch.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

通用類:

public class BaseESDaoImpl<T, ID extends Serializable> extends AbstractElasticsearchRepository<T, ID> implements BaseESDao<T, ID> {

public BaseESDaoImpl() {
    super();
}
public BaseESDaoImpl(ElasticsearchEntityInformation<T, ID> metadata, ElasticsearchOperations elasticsearchOperations) {
    super(metadata, elasticsearchOperations);
}

public BaseESDaoImpl(ElasticsearchOperations elasticsearchOperations) {
    super(elasticsearchOperations);
}

@Override
protected String stringIdRepresentation(ID id) {
    return id.toString();
}

}

實(shí)體類:

 @Document(indexName = "dcang", type = "hot_word_es")
  public class HotWordEs {

@Id
private Long id;

/**
 * 搜索類型
 */
@Field(type = FieldType.String)
private SearchType searchType;

/**
 * 搜索關(guān)鍵字,這里用了分詞器
 */
 @Field(type = FieldType.String, analyzer = "ik_max_word", searchAnalyzer=ik_max_word")
//String 被轉(zhuǎn)成 text, auto 被轉(zhuǎn)成 keyword
  private String keyword;

/**
 * 搜索人ID
 */
@Field(type = FieldType.Long)
private Long memberId;

Dao:

public interface HotWordEsDao extends BaseESDao<HotWordEs, Long>, HotWordEsDaoPlus {}

DaoPlus,相當(dāng)于dao接口,如:

public interface HotWordEsDaoPlus {
/**
 * 查詢熱門詞匯
 *
 * @param searchType 詞匯類型
 * @param size       查詢個(gè)數(shù)
 * @return 返回結(jié)果
 */
List<String> searchHotWordEs(SearchType searchType, Integer size);
}

基礎(chǔ)的環(huán)境搭建,我就是簡單的介紹下画切。重點(diǎn)來了,我們看接下來的實(shí)例:
搜索條件:

Paste_Image.png
Paste_Image.png

實(shí)體類 :
AssociationLotEs 記錄了拍品的出價(jià)次數(shù)和圍觀人數(shù)
LotEs: 拍品
MemberEs: 會(huì)員(拍品發(fā)布者)

       //根據(jù)圍觀數(shù)和競價(jià)次數(shù)囱怕,得出分值
      ScoreFunctionBuilder scoreFunctionBuilder = new ScriptScoreFunctionBuilder(new Script("return doc['observerCount'].value + doc['bidPriceCount'].value"));
     //查詢條件霍弹,最大出價(jià)大于4000的拍品
     RangeQueryBuilder maxAmount = rangeQuery("maxAmount").gte(4000);
     FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(maxAmount, scoreFunctionBuilder)
    .scoreMode(FiltersFunctionScoreQuery.ScoreMode.SUM); //函數(shù)得出的分值與原始分值相加
      //關(guān)聯(lián)子文檔查詢
      QueryBuilder child = QueryBuilders.hasChildQuery("association_lot_es", functionScoreQueryBuilder, ScoreMode.Total);

    //必須是滿足條件的店鋪
    BoolQueryBuilder parent = QueryBuilders.boolQuery();
   //這里不計(jì)入分值,僅為做滿足條件的查詢
   parent.must(termQuery("certification", "true").boost(0))
    .must(termQuery("dispute", "true").boost(0))
    .must(rangeQuery("shopLevel").gte(3).boost(0))
    .must(rangeQuery("shopScore").gte(4.7).boost(0));
     //關(guān)聯(lián)父文檔查詢
      HasParentQueryBuilder post_es_parent = QueryBuilders.hasParentQuery("member_es", parent, true);

     //第一個(gè)查詢條件生成
       BoolQueryBuilder bb2 = QueryBuilders.boolQuery();
       BoolQueryBuilder queryBuilder2 = bb2.must(post_es_parent).must(child);

       //為人工干預(yù)的查詢增加人氣打分娃弓,僅作為打分
       ScoreFunctionBuilder scoreFunctionBuilder2 = new ScriptScoreFunctionBuilder(new     Script("return doc['observerCount'].value + doc['bidPriceCount'].value"));
      FunctionScoreQueryBuilder functionScoreQueryBuilder2 =     QueryBuilders.functionScoreQuery(scoreFunctionBuilder2).scoreMode(FiltersFunctionScoreQ uery.ScoreMode.SUM);
    QueryBuilder child2 = QueryBuilders.hasChildQuery("association_lot_es", functionScoreQueryBuilder2, ScoreMode.Total);

     BoolQueryBuilder bb4 = QueryBuilders.boolQuery();
     //賦予人工干預(yù)的拍品分值典格,并組成查詢條件
       bb4.must(termQuery("artificial", true).boost(0)).should(child2);

      BoolQueryBuilder bb3 = QueryBuilders.boolQuery();
     //組合出完整的查詢語句
      bb3.should(queryBuilder2).should(bb4);
     //根據(jù)結(jié)束時(shí)間計(jì)算出相應(yīng)的分值,時(shí)間默認(rèn)分值是時(shí)間戳台丛,實(shí)際應(yīng)用中得歸一化
    ScoreFunctionBuilder scoreFunctionBuilder3 = new ScriptScoreFunctionBuilder(new  Script("return doc['endTime'].value "));
   //查詢語句
    FunctionScoreQueryBuilder functionScoreQueryBuilder3 = QueryBuilders.functionScoreQuery(bb3, scoreFunctionBuilder3)
    .boostMode(CombineFunction.SUM);//得分相加
    Page< LotEs > search = lotEsDao.search(functionScoreQueryBuilder3, new PageRequest(0, 10));

注意事項(xiàng):
超代關(guān)系的文檔耍缴,必須在同一分片上。所以routing必須保持一致挽霉,不然查詢結(jié)果會(huì)出錯(cuò)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末防嗡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炼吴,更是在濱河造成了極大的恐慌本鸣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硅蹦,死亡現(xiàn)場離奇詭異荣德,居然都是意外死亡闷煤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門涮瞻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲤拿,“玉大人,你說我怎么就攤上這事署咽〗辏” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵宁否,是天一觀的道長窒升。 經(jīng)常有香客問我,道長慕匠,這世上最難降的妖魔是什么饱须? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮台谊,結(jié)果婚禮上蓉媳,老公的妹妹穿的比我還像新娘。我一直安慰自己锅铅,他們只是感情好酪呻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盐须,像睡著了一般玩荠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丰歌,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天姨蟋,我揣著相機(jī)與錄音屉凯,去河邊找鬼立帖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悠砚,可吹牛的內(nèi)容都是我干的晓勇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灌旧,長吁一口氣:“原來是場噩夢啊……” “哼绑咱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枢泰,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤描融,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后衡蚂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窿克,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骏庸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了年叮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片具被。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖只损,靈堂內(nèi)的尸體忽然破棺而出一姿,到底是詐尸還是另有隱情,我是刑警寧澤跃惫,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布叮叹,位于F島的核電站,受9級(jí)特大地震影響爆存,放射性物質(zhì)發(fā)生泄漏衬横。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一终蒂、第九天 我趴在偏房一處隱蔽的房頂上張望蜂林。 院中可真熱鬧,春花似錦拇泣、人聲如沸噪叙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睁蕾。三九已至,卻和暖如春债朵,著一層夾襖步出監(jiān)牢的瞬間子眶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工序芦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臭杰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓谚中,卻偏偏與公主長得像渴杆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子宪塔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理磁奖,服務(wù)發(fā)現(xiàn),斷路器某筐,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • 文章作者:Tyan博客:noahsnail.com 2.Introduction to the Spring Fr...
    SnailTyan閱讀 5,390評(píng)論 7 56
  • 一片樹林比搭,流三道河 說出的地名,都到達(dá)過 透明的魚蝦南誊,翻騰著油膩的網(wǎng) 最喜歡的還是身诺,地頭的涼風(fēng) 吹來遠(yuǎn)處淳樸的吆喝...
    伯爵男主閱讀 662評(píng)論 0 4
  • Kotlin開發(fā)安卓應(yīng)用 Kotlin基本語法 Kotlin搭建安卓項(xiàng)目的項(xiàng)目清單 Kotlin調(diào)用UIFrame...
    Panco_Lee閱讀 560評(píng)論 0 2