7.ElasticSearch(SpringDataElasticSearch)

    ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。
    cluster
    代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的.

核心概念:
索引:类似于数据表
映射:类似于建表语句 字段名称、字段类型、字段是否分词、是否存储、使用什么分词器
文档:类似于一行一行的表记录
文档类型:方便查询,把不同的文档类型放到一个索引里面
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层与操作数据库的DAO层的包要区分开来,否则会有冲突
  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.查询
    //根据词条精准匹配查询
    QueryBuilder termQuery = new TermQueryBuilder("customerNum",customer.getcustomerNum());
    //根据词条模糊匹配查询
    QueryBuilder wildcardQuery = new WildcardQueryBuilder("sendAddress", "*" + customer.getSendAddress() + "*");
    //先把查询内容分词,再去索引库比对查询
    QueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder(customer.getSendAddress()).field("sendAddress").defaultOperator(Operator.AND);
        把查询内容分词,然后拿分词后的词条和索引库的词条比对
        默认Operator.OR   搜索条件中只要有一个词条和索引库匹配了,就可以查到
        设置Operator.AND  搜索条件中的所有词条都要和索引库匹配,才可以查到
    //布尔查询 ,多条件组合查询
    BoolQueryBuilder query = new BoolQueryBuilder(); 
 
    理解思路:
    要有面向对象的思想,每一个条件封装成一个对象(Hibernate的QBC查询、SpringDataJpa的条件查询)
    页面上一个参数,就是一个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)) { 
                // 无条件查询 、查询数据库
                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())) {
                    // 发货地 模糊查询
                    // 情况一: 输入"北" 是查询词条一部分, 使用模糊匹配词条查询
                    QueryBuilder wildcardQuery = new WildcardQueryBuilder(
                            "sendAddress", "*" + customer.getSendAddress() + "*");

                    // 情况二: 输入"北京市海淀区" 是多个词条组合,进行分词后 每个词条匹配查询
                    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) {
                    // 签收状态查询
                    QueryBuilder termQuery = new TermQueryBuilder("signStatus",
                            customer.getSignStatus());
                    query.must(termQuery);
                }

                SearchQuery searchQuery = new NativeSearchQuery(query);
                searchQuery.setPageable(pageable); // 分页效果
                // 有条件查询 、查询索引库
                return customerIndexRepository.search(searchQuery);
            }

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 欢迎访问本人博客:http://wangnan.tech Elasticsearch是一个可伸缩的开源全文搜索和分...
    GhostStories阅读 3,086评论 0 10
  • 我换了一个新的学员队,换了新的队干部。我成了班长,带了两个小弟和一个大哥。 成为班长的原意是因为我是老学员(留级生...
    嘴上说不要不要阅读 65评论 0 0
  • 人生我们会遇见许许多多的“朋友”但是这里有多少是真正的朋友我们可以把猪朋狗友也叫作朋友但是我们遇到困难了真正会帮助...
    8d79327086c8阅读 311评论 0 0
  • 常常有男人抱怨,我的女人怎么变了,不再像刚谈恋爱时那么温柔体贴,那么小鸟依人了,是不是被我惯坏了 男人啊,女人被宠...
    娜娜lina阅读 409评论 0 0