spring-data-elasticsearch 实例

抛开原生的操作,这里我们采用spring提供的框架进行操作,会是操作方便不少。

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();
}

}

实体类:

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

@Id
private Long id;

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

/**
 * 搜索关键字,这里用了分词器
 */
 @Field(type = FieldType.String, analyzer = "ik_max_word", searchAnalyzer=ik_max_word")
//String 被转成 text, auto 被转成 keyword
  private String keyword;

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

Dao:

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

DaoPlus,相当于dao接口,如:

public interface HotWordEsDaoPlus {
/**
 * 查询热门词汇
 *
 * @param searchType 词汇类型
 * @param size       查询个数
 * @return 返回结果
 */
List<String> searchHotWordEs(SearchType searchType, Integer size);
}

基础的环境搭建,我就是简单的介绍下。重点来了,我们看接下来的实例:
搜索条件:

Paste_Image.png
Paste_Image.png

实体类 :
AssociationLotEs 记录了拍品的出价次数和围观人数
LotEs: 拍品
MemberEs: 会员(拍品发布者)

       //根据围观数和竞价次数,得出分值
      ScoreFunctionBuilder scoreFunctionBuilder = new ScriptScoreFunctionBuilder(new Script("return doc['observerCount'].value + doc['bidPriceCount'].value"));
     //查询条件,最大出价大于4000的拍品
     RangeQueryBuilder maxAmount = rangeQuery("maxAmount").gte(4000);
     FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(maxAmount, scoreFunctionBuilder)
    .scoreMode(FiltersFunctionScoreQuery.ScoreMode.SUM); //函数得出的分值与原始分值相加
      //关联子文档查询
      QueryBuilder child = QueryBuilders.hasChildQuery("association_lot_es", functionScoreQueryBuilder, ScoreMode.Total);

    //必须是满足条件的店铺
    BoolQueryBuilder parent = QueryBuilders.boolQuery();
   //这里不计入分值,仅为做满足条件的查询
   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));
     //关联父文档查询
      HasParentQueryBuilder post_es_parent = QueryBuilders.hasParentQuery("member_es", parent, true);

     //第一个查询条件生成
       BoolQueryBuilder bb2 = QueryBuilders.boolQuery();
       BoolQueryBuilder queryBuilder2 = bb2.must(post_es_parent).must(child);

       //为人工干预的查询增加人气打分,仅作为打分
       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();
     //赋予人工干预的拍品分值,并组成查询条件
       bb4.must(termQuery("artificial", true).boost(0)).should(child2);

      BoolQueryBuilder bb3 = QueryBuilders.boolQuery();
     //组合出完整的查询语句
      bb3.should(queryBuilder2).should(bb4);
     //根据结束时间计算出相应的分值,时间默认分值是时间戳,实际应用中得归一化
    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));

注意事项:
超代关系的文档,必须在同一分片上。所以routing必须保持一致,不然查询结果会出错

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容