Elasticsearch 检索
说到查询,那么索引也是一个绕不开的话题,可以说,没有索引就没有检索,先来看一个示意图

左边是索引过程,右边是检索过程。关键的步骤是分词过程,我用等号表示这两个过程一样,而且,必须一样,这个等号并不是模糊的流程的相同,而且必须是逻辑也相同。 简单来讲,采用的分词器和分词流程需要一样,否则,很有可能填进去的文档,搜不出来。
本篇重点在如何用JAVA API实现查询上,就不深入说索引的过程了,以后有时间再深入。
对于查询,有两个基础的类型,Match查询,和Term查询。这也是跟索引过程相关的。刚开始接触的索引,我就想,如果把所有的内容都做搜索,那么一是需要建立非常多的索引,再一个是要保存特别多的原始数据,随着了解的加深,我发现并不是这样的。
在进行索引的时候,先新建文档,在往文档中添加字段时,有Index设置和Store设置。index设置就是是否要对这个字段用分词器进行分词。举个例子,有个字段A,内容为中华人民共和国国歌,以中文分词器IK为例,如果不进行分词,那么往索引中插入的时候,直接用一个词“中华人民共和国国歌”。如果A字段设置为进行索引,那么IK分词器就会将“中华人民共和国国歌”分解为“中华人民共和国”和“国歌”两个词,往索引中添加的时候,是两个记录。
对于Store选项,如果选择Yes,就是存储这个字段的原始值,对于字段A来说,就是保存“中华人民共和国国歌”,这样,在检索之后,如果查询到字段A,可以返回A的原始值。如果选择Store为No,并且设置为A进行索引,那么A字段的原始值就不可知了。索引中只存在“中华人民共和国”和“国歌”,并不存在“中华人民共和国国歌”。你可以检索到字段A,但是A的原始值是什么,ES就不知道了,需要去原始的数据源中找出来。
这两个设置是十分关键的,比如id,基本不需要进行索引分词,直接存储就是了,而且,你查询的时候,也肯定不需要对id进行分词,所以,这个就是term查询的用处。term就是词的意思,Lucene中将分词之后的结果成为Term,所以,像id这样的不需要分词的,直接就跟经过分词步骤的词一样了,可以用这个词直接去倒排索引中查询了。所以,Term查看的字段,最好设置为Index为No,否则,一般搜不到。
Store选项可以有效减小ES的存储规模,你想想,你用百度去搜索,肯定都会到目标的网页,而不是在百度里面浏览,百度只要告诉你,你想去的网页的URL就可以了。所以,在进行索引的时候,像整个网页的内容,并不是需要的,需要的是对整个网页进行分词之后产生的词,然后就可以将原始的网页文本丢弃了。当然,百度也存储了这个内容的,百度快照就是。
Match查询就是需要对搜索的关键词进行分词,然后将分词的结果拿到倒排索引里面去检索,检索之后,再对这个结果进行相关性分词,然后排序进行输出。可以看出,Match查询要比Term查询多了至少两步,分词和相关性计算。
比如说我们要索引一个网页,网页有一些基本meta信息。那么首先,我们把网页给抓取到,分析网页里面的内容。网页的meta信息比较关键,我们提取出来,准备构建一个文档,网页的关键字,meta信息,更新时间等这些都可以成为
除了这两类最主要的,还有范围查询,bool查询等,这些都是跟SQL一样的组合查询。
SearchRequestBuilder是最主要的查询方法,QueryBuilders提供了多种构造查询语句的方式。Kibana里面集成的DevTools是使用Query DSL非常方便的一个工具。

SearchRequestBuilder searchRequestBuilder = client.prepareSearch((String[])tempIndices.toArray(new String[tempIndices.size()]));
searchRequestBuilder.setTypes(typesName);
searchRequestBuilder.setQuery(qb);
searchRequestBuilder.addStoredField(field);//设置返回的字段,注意,这里返回的必须是Stored是Yes的。
searchRequestBuilder.setSize(size);
searchRequestBuilder.setFrom(from);
SearchResponse searchResponse = requestBuilder.execute().actionGet();
那么如何构造Query?这就是如何从我们的查询转化成ES的Query DSL,有关kibana使用的就是DSL,有关DSL的介绍,查看elastic.co或者网站翻译的Elasticsearch权威指南。尽量还是参考elastic.co的,因为ES更新比较快,最靠谱的还是上面的介绍。
QueryBuilders.rangeQuery();//范围查询
QueryBuilders.geoDistanceRangeQuery("fieldName", new GeoPoint(Long.parseLong("经度"), Long.parseLong("纬度")))
.from( "1km")
.to("2km")
.includeLower(true)
.includeUpper(true);//地理位置插叙
QueryBuilders.termQuery("field", "keyword");//term查看
QueryBuilders.matchQuery("field", "keyword");//match查看
另外,可以使用QueryBuilders.boolQuery();将上面的query联合起来,连接的关系有Must(等同于SQL的AND),MustNot(等同于SQL的NOT),SHOULD(等同于OR)。
基本上,以上都是初步的查询API。
Elasticsearch 检索的更多相关文章
- ElasticSearch(十)Elasticsearch检索出的数据列表按字段匹配的优先顺序及搜索单词拼音一部分搜不到数据
检索出的数据列表按字段匹配的优先顺序 一.举例 比如,发布一篇文章,文章包括基本的字段包括标题.发布时间.点击率.关键字.内容.当在页面中输入“教育”搜索关键词,会检索出指定字段包括“教育”的所有数据 ...
- ElasticSearch 检索文档
1.检索文档 现在Elasticsearch中已经存储了一些数据,我们可以根据业务需求开始工作了.第一个需求是能够检索单个员工的信息. 这对于Elasticsearch来说非常简单.我们只要执行HTT ...
- Elasticsearch检索分类详解
前言 Elasticsearch中当我们设置Mapping(分词器.字段类型)完毕后,就可以按照设定的方式导入数据. 有了数据后,我们就需要对数据进行检索操作.根据实际开发需要,往往我们需要支持包含但 ...
- 云计算平台(检索篇)-Elasticsearch
前段时间为公司基于Elasticsearch(下面简称ES)做了一套检索平台,下面将这段时间积累的一些知识与大家分享,如有不对之处,欢迎大家多多批评与建议.针对Elasticsearch由于东西还是比 ...
- elasticsearch Java API汇总
http://blog.csdn.net/changong28/article/details/38445805#comments 3.1 集群的连接 3.1.1 作为Elasticsearch节点 ...
- 用 Mahout 和 Elasticsearch 实现推荐系统
原文地址 本文内容 软件 步骤 控制相关性 总结 参考资料 本文介绍如何用带 Apache Mahout 的 MapR Sandbox for Hadoop 和 Elasticsearch 搭建推荐引 ...
- ElasticSearch和solr的差别
Elasticsearch简介 Elasticsearch是一个实时分布式搜索和分析引擎.它让你以前所未有的速度处理大数据成为可能.它用于全文搜索.结构化搜索.分析以及将这三者混合使用:维基百科使用E ...
- 《读书报告 -- Elasticsearch入门 》-- 安装以及简单使用(1)
<读书报告 – Elasticsearch入门 > 第一章 Elasticsearch入门 Elasticsearch是一个实时的分布式搜索和分析引擎,使得人们可以在一定规模上和一定速度上 ...
- ElasticSearch入门介绍一
ElasticSearch 关于es的几个概念: 集群:多个运行es节点可以组成一个集群,它们拥有相同的cluster.name. 节点:运行es的实例 索引:相当于数据库database,一个集群可 ...
随机推荐
- 技术之余。。。电吉他自弹 魂斗罗 solo
测试一下 ---恢复内容开始--- ---恢复内容结束---
- 关于UIView的显示问题
今天在倒腾PP助手SDK的接入,游戏框架使用的是cocos2d-x,因为不熟悉iOS的UIKit,所以费了点功夫终于让SDK的登录页面显示出来了,问题来了,在iOS设备landscape显示模式UI显 ...
- 用 正则表达式 限定XML simpleType 定义
<xsd:simpleType name="ResTrictions"> <xsd:restriction base="xsd:string" ...
- 这次是Selenide测试自动发送博客
asdfasfdfsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdsfasdfdas
- js阻止form表单重复提交
防止表单重复提交的方法总体来说有两种,一种是在js中阻止重复提交:另一种是在后台利用token令牌实现,大致思路是生成一个随机码放到session和form表单的隐藏输入框中,提交表单时两者对比,表单 ...
- EF的性能改善和思考
EF是个工具,用的好了性能就会很好,用的不好性能就会有很大损失. 先从EF的设计思想来讲解 EF的初衷是根据缓存中的实体对象,以及实体对象的状态(删除.更新.添加)来对数据库进行操作,这些实体对象.以 ...
- 关于iOS 10不能跳转设置的解决办法
NSURL*url=[NSURL URLWithString:@"Prefs:root=WIFI"]; Class LSApplicationWorkspace = NSClas ...
- OpenWrt > ADSL单线多拨,负载均衡(仅供参考)
前题 硬件:路由器,刷入OpenWrt 一些背景知识和动手能力 目标效果图 步骤 使用SSH 登陆路由器.I.e. ssh root@192.168.2.1 运行/usr/bin/duobo.日志类似 ...
- centos6安装svn1.9
增加svn的源,vi /etc/yum.repos.d/wandisco-svn.repo [WandiscoSVN] name=Wandisco SVN Repo baseurl=http://op ...
- VC++ 回调函数及使用方法(转)
转载:http://blog.csdn.net/vsooda/article/details/7435801 转载:http://blog.csdn.net/lincyang/article/deta ...