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,一个集群可 ...
随机推荐
- windows防火墙命令
删除防火墙:netsh advfirewall firewall delete rule name=%gate_rule_name% 添加防火墙:netsh advfirewall firewall ...
- MYSQL中replace into的用法
新建一个test表,三个字段,id,title,uid, id是自增的主键,uid是唯一索引: 插入两条数据 '); ');执行单条插入数据可以看到,执行结果如下: [SQL]insert into ...
- Dom编程
Dom编程 Dom是一种用于HTML和XML文档的编程接口,是HTML页面的模型,将每个标签都做为一个对象,JavaScript通过调用DOM中的属性.方法就可以对网页中的文本框.层等元素进行编程控制 ...
- JavaScript简介
JavaScript JavaScript 是一种轻量级的编程语言,是可插入 HTML 页面的编程代码,这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等 ...
- JS 获取url参数
<html> <body> 浏览器中输入 http://localhost/test/js_url.php?a1=aaa&a2=bbb&a3=ccc 会依次弹出 ...
- Volley 实现原理图
1.启动requestQueue 2. 添加请求 3. 启动cacheDispatcher 4.启动networkDispatcher 5. 数据分发
- webstorm IDE添加Plugins----添加vue插件
webstorm IDE很强大了,扩展性很强,语法校验很强大,不过有时候一些特殊的插件 还是需要自己添加到IDE的 下面以添加VUE Plugins 为例: Setting--Plugins[点下方 ...
- http协议梳理(个人学习用)
HTTP默认的端口号为80,HTTPS的端口号为443. 在Internet中所有的传输都是通过TCP/IP进行的.HTTP协议作为TCP/IP模型中应用层的协议.HTTP协议通常承载于TCP协议之上 ...
- Java,double类型转换成String,String装换成double型
今天,老师布置了小系统,银行用户管理系统,突然发现自己的基础知识好薄弱,就把这些记录一下, double类型转化string:Double.toString(double doub); String类 ...
- 一个ubuntu phper的自我修养(杂记)
ubuntu使用杂记 1.flatabulous安装使用. flatabulous是一个ubuntu图标主题. 使用它,必须得安装tweak插件. sudo add-apt-repository pp ...