lucene原理、elasticsearch使用学习
2020-06-22 09:56:13 6 举报
elasticsearch 使用样例
作者其他创作
大纲/内容
pretty作用
在请求的查询串参数中加上 pretty 参数,正如前面的例子中看到的,这将会调用 Elasticsearch 的 pretty-print 功能,该功能 使得 JSON 响应体更加可读。但是, _source 字段不能被格式化打印出来。相反,我们得到的 _source 字段中的 JSON 串,刚好是和我们传给它的一样。
说明
Elastcisearch 是分布式的 文档 存储。它能存储和检索复杂的数据结构—序列化成为JSON文档—以 实时 的方式。 换句话说,一旦一个文档被存储在 Elasticsearch 中,它就是可以被集群中的任意节点检索到。
交互
Sense 是一个 Kibana 应用 它提供交互式的控制台,通过你的浏览器直接向 Elasticsearch 提交请求。 这本书的在线版本包含有一个 View in Sense 的链接,里面有许多代码示例。当点击的时候,它会打开一个代码示例的Sense控制台。 你不必安装 Sense,但是它允许你在本地的 Elasticsearch 集群上测试示例代码,从而使本书更具有交互性。./bin/kibana plugin --install elastic/sense ./bin/kibana //启动
问题说明
这意味着如果你通过引号( \"123\" )索引一个数字,它会被映射为 string 类型,而不是 long 。但是,如果这个域已经映射为 long ,那么 Elasticsearch 会尝试将这个字符串转化为 long ,如果无法转化,则抛出一个异常。
多级排序
uery-string 搜索 也支持自定义排序,可以在查询字符串中使用 sort 参数:GET /_search?sort=date:desc&sort=_score&q=search
映射说明
开源和结构
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库—无论是开源还是私有。但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。
返回文档的一部分
GET 请求会返回整个文档,这个文档正如存储在 _source 字段中的一样。但是也许你只对其中的 font color=\"#ff3333\
相关性计算问题
由于这是我们看到的第一个包含多个查询的查询,所以有必要讨论一下相关性得分是如何组合的。每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。
倒排索引
倒排索引:关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。默认的,一个文档中的每一个属性都是 被索引 的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的
每个员工索引一个文档,文档包含该员工的所有信息。每个文档都将是 employee 类型 。该类型位于 索引 megacorp 内。该索引保存在我们的 Elasticsearch 集群中。PUT /megacorp/employee/1{ \"first_name\" : \"John\
处理冲突
取回
作用
它被用作全文检索、结构化搜索、分析以及这三个功能的组合GitHub 使用 Elasticsearch 对1300亿行代码进行查询。
转URL
这些可以通过右上方转为相应的URL语句。找到最终实现方式
索引生成
通过使用 index API ,文档可以被 索引 —— 存储和使文档可被搜索。 但是首先,我们要确定文档的位置。正如我们刚刚讨论的,一个文档的 _index 、 _type 和 _id 唯一标识一个文档。 我们可以提供自定义的 _id 值,或者让 index API 自动生成。
type类型作用
数据可能在索引中只是松散的组合在一起,但是通常明确定义一些数据中的子分区是很有用的。 例如,所有的产品都放在一个索引中,但是你有许多不同的产品类别,比如 \"electronics\" 、 \"kitchen\" 和 \"lawn-care\"。这些文档共享一种相同的(或非常相似)的模式:他们有一个标题、描述、产品代码和价格。他们只是正好属于“产品”下的一些子类可以管理和维护
重要查询
match_all 查询简单的匹配所有文档。在没有指定查询方式时,它是默认的查询:{ \"match_all\": {}}拷贝为 cURL在 Sense 中查看 它经常与 filter 结合使用—例如,检索收件箱里的所有邮件。所有邮件被认为具有相同的相关性,所以都将获得分值为 1 的中性 _score。
文档对象描述
对象中也可以嵌套其他的对象。 对象可能包含了另外一些对象。在 Elasticsearch 中,术语 文档 有着特定的含义。font color=\"#ff0000\
添加索引
不同字段的组合查询
下一个查询在 name 字段中包含 john 并且在 tweet 字段中包含 mary 的文档。实际的查询就是这样+name:john +tweet:mary+ 前缀表示必须与查询条件匹配。类似地, - 前缀表示一定不与查询条件匹配。没有 + 或者 - 的所有其他条件都是可选的——匹配的越多,文档就越相关。
分析和分析器
分析 包含下面的过程:首先,将一块文本分成适合于倒排索引的独立的 词条 ,之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall分析器执行上面的工作。 分析器 实际上是将三个功能封装到了一个包里:
组合多查询
现实的查询需求从来都没有那么简单;它们需要在多个字段上查询多种多样的文本,并且根据一系列的标准来过滤。为了构建类似的高级查询,你需要一种能够将多查询组合成单一查询的查询方法。你可以用 bool 查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询。它接收以下参数:must文档 必须 匹配这些条件才能被包含进来。must_not文档 必须不 匹配这些条件才能被包含进来。should如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。filter必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
暂时结束
欣喜的是,这是一个关于 Elasticsearch 基础描述的教程,且仅仅是浅尝辄止,更多诸如 suggestions、geolocation、percolation、fuzzy 与 partial matching 等特性均被省略,以便保持教程的简洁。但它确实突显了开始构建高级搜索功能多么容易。不需要配置——只需要添加数据并开始搜索!很可能语法会让你在某些地方有所困惑,并且对各个方面如何微调也有一些问题。没关系!本书后续内容将针对每个问题详细解释,让你全方位地理解 Elasticsearch 的工作原理。
使用分析器的场景
当我们 索引 一个文档,它的全文域被分析成词条以用来创建倒排索引。 但是,当我们在全文域 搜索 的时候,我们需要将查询字符串通过 相同的分析过程 ,以保证我们搜索的词条格式与索引中的词条格式一致。
分析功能--异常强大
终于到了最后一个业务需求:支持管理者对员工目录做分析。 Elasticsearch 有一个功能叫聚合(aggregations),允许我们基于数据生成一些精细的分析结果。聚合与 SQL 中的 GROUP BY 类似但更强大。对数据进行分组统计啥的。很强大GET /megacorp/employee/_search{ \"aggs\": { \"all_interests\": { \"terms\": { \"field\": \"interests\" } } }}
多值字段排序
一种情形是字段有多个值的排序, 需要记住这些值并没有固有的顺序;一个多值的字段仅仅是多个值的包装,这时应该选择哪个进行排序呢?对于数字或日期,你可以将多值字段减为单值,这可以通过使用 min 、 max 、 avg 或是 sum 排序模式 。 例如你可以按照每个 date 字段中的最早日期进行排序,通过以下方法:\"sort\": { \"dates\": { \"order\": \"asc\
Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
分页确定返回几个排序索引的文档
健壮查询的查询表达式
领域特定语言 (DSL)GET /megacorp/employee/_search{ \"query\" : { \"match\" : { \"last_name\" : \"Smith\" } }}
请求要求
.....一个 JSON 格式的请求体 (如果请求需要的话)curl -XGET 'http://localhost:9200/_count?pretty' -d '{ \"query\": { \"match_all\": {} }} //请求返回{ \"count\
json化
在 Elasticsearch 中将对象转化为 JSON 后构建索引要比在一个扁平的表结构中要简单的多。几乎所有的语言都有可以将任意的数据结构或对象转化成 JSON 格式的模块,只是细节各不相同。具体请查看 serialization 或者 marshalling 这两个处理 JSON 的模块。官方 Elasticsearch 客户端 自动为您提供 JSON 转化。
索引员工文档
第一个业务需求是存储员工数据。 这将会以 员工文档 的形式存储:一个文档代表一个员工。存储数据到 Elasticsearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。
说明
返回结果不仅告知匹配了哪些文档,还包含了整个文档本身:显示搜索结果给最终用户所需的全部信息。
映射和分析
轻量搜索
面向文档
Elasticsearch 是 面向文档 的,意味着它存储整个对象或 文档。Elasticsearch 不仅存储文档,而且 索引 每个文档的内容,使之可以被检索。在 Elasticsearch 中,我们对文档进行索引、检索、排序和过滤—而不是对行列数据。这是一种完全不同的思考数据的方式,也是 Elasticsearch 能支持复杂全文检索的原因。
验证查询是否合法
curl请求才会包含请求体
在返回结果中没有看到 HTTP 头信息是因为我们没有要求`curl`显示它们。想要看到头信息,需要结合 -i 参数来使用 curl 命令:
去重
通信
Elasticsearch 为以下语言提供了官方客户端--Groovy、JavaScript、.NET、 PHP、 Perl、 Python 和 Ruby—还有很多社区提供的客户端和插件,所有这些都可以在 Elasticsearch Clients 中找到。
查询可以变得非常的复杂,尤其和不同的分析器与不同的字段映射结合时,理解起来就有点困难了。不过 validate-query API 可以用来验证查询是否合法。GET /gb/tweet/_validate/query{ \"query\": { \"tweet\" : { \"match\" : \"really powerful\" } }}
简单用例
编码后可读性差,所以不推荐使用这种方式
查询字符串在做了适当的编码后,可读性很差:?q=%2Bname%3A(mary+john)+%2Bdate%3A>2014-09-10+%2B(aggregations+geo)
文档取回
导入批量json文件的形式
使用logstash
文档元数据
_index文档在哪存放_type文档表示的对象类别_id文档唯一标识
未学习
一次进行多个请求发送批量操作
elastic和关系数据库区别 说明
在 Elasticsearch 中, 每个字段的所有数据 都是 默认被索引的 。 即每个字段都有为了快速检索设置的专用倒排索引。而且,不像其他多数的数据库,它能在 同一个查询中 使用所有这些倒排索引,并以惊人的速度返回结果。
指定索引和搜索时候的解析器
analyzer编辑对于 analyzed 字符串域,用 analyzer 属性指定在搜索和索引时使用的分析器。默认, Elasticsearch 使用 standard 分析器, 但你可以指定一个内置的分析器替代它,例如 whitespace 、 simple 和 english:{ \"tweet\": { \"type\": \"string\
假定我们想要结合使用 date 和 _score 进行查询,并且匹配的结果首先按照日期排序,然后按照相关性排序GET /_search{ \"query\" : { \"bool\" : { \"must\": { \"match\": { \"tweet\": \"manage text search\
如果你正在使用 Java,在代码中你可以使用 Elasticsearch 内置的两个客户端:节点客户端(Node client)节点客户端作为一个非数据节点加入到本地集群中。换句话说,它本身不保存任何数据,但是它知道数据在集群中的哪个节点中,并且可以把请求转发到正确的节点。传输客户端(Transport client)轻量级的传输客户端可以将请求发送到远程集群。它本身不加入集群,但是它可以将请求转发到集群中的一个节点上。
要求
我们受雇于 Megacorp 公司,作为 HR 部门新的 “热爱无人机” (\"We love our drones!\")激励项目的一部分,我们的任务是为此创建一个员工目录。该目录应当能培养员工认同感及支持实时、高效、动态协作支持包含多值标签、数值、以及全文本的数据检索任一员工的完整信息允许结构化搜索,比如查询 30 岁以上的员工允许简单的全文搜索以及较复杂的短语搜索支持在匹配文档内容中高亮显示搜索片段支持基于数据创建和管理分析仪表盘
使用elasticsearch生成索引策略
如果你的数据没有自然的 ID, Elasticsearch 可以帮我们自动生成 ID 。 请求的结构调整为: 不再使用 PUT 谓词(“使用这个 URL 存储这个文档”), 而是使用 POST 谓词(“存储文档在这个 URL 命名空间下”)。POST /website/blog/{ \"title\": \"My second blog entry\
删除、
为达到不同目的,这三个功能可以组合
Elasticsearch提供了开箱即用的字符过滤器、分词器和token 过滤器。 这些可以组合起来形成自定义的分析器以用于不同的目的。我们会在 自定义分析器 章节详细讨论。
条件查询
现在尝试下更复杂的搜索。 同样搜索姓氏为 Smith 的员工,但这次我们只需要年龄大于 30 的。查询需要稍作调整,使用过滤器 filter ,它支持高效地执行一个结构化查询。GET /megacorp/employee/_search{ \"query\" : { \"bool\": { \"must\": { \"match\" : { \"last_name\" : \"smith\
索引类型说明
高亮检索
许多应用都倾向于在每个搜索结果中 高亮 部分文本片段,以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易。GET /megacorp/employee/_search{ \"query\" : { \"match_phrase\" : { \"about\" : \"rock climbing\
安装
直接解压交互安装图形界面进行或者curl等
索引满足大于一万也能检索
选定一个index,关闭其索引,打开复合查询命令框和查询框分别输入以下信息,以put方式提交索引/_settings?preserve_existing=true { \"max_result_window\" : \"2000000000\" }
查询表达式
查询表达式(Query DSL)是一种非常灵活又富有表现力的 查询语言。 Elasticsearch 使用它可以以简单的 JSON 接口来展现 Lucene 功能的绝大部分。在你的应用中,你应该用它来编写你的查询语句。它可以使你的查询语句更灵活、更精确、易读和易调试。
match查询
无论你在任何字段上进行的是全文搜索还是精确查询,match 查询是你可用的标准查询。如果你在一个全文字段上使用 match 查询,在执行查询前,它将用正确的分析器去分析查询字符串:{ \"match\": { \"tweet\": \"About Search\" }}
创建过程
为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条 或 tokens ),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:Term Doc_1 Doc_2-------------------------Quick | | XThe | X |brown | X | Xdog | X |dogs | | Xfox | X |foxes | | Xin | | Xjumped | X |lazy | X | Xleap | | Xover | X | Xquick | X |summer | | Xthe | X |现在,如果我们想搜索 quick brown ,我们只需要查找包含每个词条的文档:Term Doc_1 Doc_2-------------------------brown | X | Xquick | X |------------------------Total | 2 | 1
如果不对某一特殊的索引或者类型做限制,就会搜索集群中的所有文档。Elasticsearch 转发搜索请求到每一个主分片或者副本分片,汇集查询出的前10个结果,并且返回给我们。。搜索一个索引有五个主分片和搜索五个索引各有一个分片准确来所说是等价的。
分片含义
一个 分片 是一个底层的 工作单元 ,它仅保存了全部数据中的一部分而现在我们只需知道一个分片是一个 Lucene 的实例以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。
数据库的缺点
大部分数据库在从你的数据中提取可用知识时出乎意料的低效。 当然,你可以通过时间戳或精确值进行过滤,但是它们能够全文检索、处理同义词、通过相关性给文档评分么? 它们能从同样的数据中生成分析与聚合数据吗?最重要的是,它们能实时地做到上述操作,而不经过大型批处理的任务么?Elasticsearch 鼓励你去探索与利用数据,而不是因为查询数据太困难,就让它们烂在数据仓库里面。
指定分析器
当Elasticsearch在你的文档中检测到一个新的字符串域,它会自动设置其为一个全文 字符串 域,使用 标准 分析器对它进行分析。你不希望总是这样。可能你想使用一个不同的分析器,适用于你的数据使用的语言。有时候你想要一个字符串域就是一个字符串域—不使用分析,直接索引你传入的精确值,例如用户ID或者一个内部的状态域或标签。要做到这一点,我们必须手动指定这些域的映射。
需求
让我们从一个简单的教程开始并介绍索引、搜索及聚合等基础概念。
两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们使用仅计算匹配词条数量的简单 相似性算法 ,那么,我们可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更佳。这非常重要。你只能搜索在索引中出现的词条,所以索引文本和查询字符串必须标准化为相同的格式。
安装交互
怎样在确定字段上模糊查询
自定义映射
相关性程度排序得分
Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。第一个最高得分的结果很明显:John Smith 的 about 属性清楚地写着 “rock climbing” 。但为什么 Jane Smith 也作为结果返回了呢?原因是她的 about 属性里提到了 “rock” 。因为只有 “rock” 而没有 “climbing” ,所以她的相关性得分低于 John 的。
如果在一个精确值的字段上使用它,例如数字、日期、布尔或者一个 not_analyzed 字符串字段,那么它将会精确匹配给定的值:{ \"match\": { \"age\": 26 }}{ \"match\": { \"date\": \"2014-09-01\" }}{ \"match\": { \"public\": true }}{ \"match\": { \"tag\": \"full_text\" }}
可配置高级模块
随着你知识的积累,你可以利用 Elasticsearch 更多的高级特性,它的整个引擎是可配置并且灵活的。 从众多高级特性中,挑选恰当去修饰的 Elasticsearch,使它能解决你本地遇到的问题。
索引含义
我们往 Elasticsearch 添加数据时需要用到 索引 —— 保存相关数据的地方。 索引实际上是指向一个或者多个物理 分片 的 逻辑命名空间 。(或者地址)
有待进一步研究
输出基本是第一次聚合的加强版。依然有一个兴趣及数量的列表,只不过每个兴趣都有了一个附加的 avg_age 属性,代表有这个兴趣爱好的所有员工的平均年龄。即使现在不太理解这些语法也没有关系,依然很容易了解到复杂聚合及分组通过 Elasticsearch 特性实现得很完美,能够提取的数据类型也没有任何限制。
映射
提供Restful API
Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
副本分片作用
一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份
相关性如何计算
可做的事
在类似于 gender 或者 age 这样的字段上使用结构化查询,join_date 这样的字段上使用排序,就像SQL的结构化查询一样。全文检索,找出所有匹配关键字的文档并按照_相关性(relevance)_ 排序后返回结果。以上二者兼而有之。
id的定位作用
ID 是一个字符串,当它和 _index 以及 _type 组合就可以唯一确定 Elasticsearch 中的一个文档。 当你创建一个新的文档,要么提供自己的 _id ,要么让 Elasticsearch 帮你生成。
全文检索
现在尝试下稍微高级点儿的全文搜索——一项 传统数据库确实很难搞定的任务。搜索下所有喜欢攀岩(rock climbing)的员工:GET /megacorp/employee/_search{ \"query\" : { \"match\" : { \"about\" : \"rock climbing\" } }}显然我们依旧使用之前的 match 查询在`about` 属性上搜索 “rock climbing” 。得到两个匹配的文档:{ ... \"hits\": { \"total\
集群分片作用
Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。
强大之处
映射(Mapping)描述数据在每个字段内如何存储分析(Analysis)全文是如何处理使之可以被搜索的领域特定查询语言(Query DSL)Elasticsearch 中强大灵活的查询语言
小节
什么是相关性
调用方式
Elasticsearch 将所有的功能打包成一个单独的服务,这样你可以通过程序与它提供的简单的 RESTful API 进行通信, 可以使用自己喜欢的编程语言充当 web 客户端,甚至可以使用命令行(去充当这个客户端)。
排名
下面的查询用于查找 title 字段匹配 how to make millions 并且不被标识为 spam 的文档。那些被标识为 starred 或在2014之后的文档,将比另外那些文档拥有更高的排名。如果 两者 都满足,那么它排名将更高:{ \"bool\": { \"must\": { \"match\": { \"title\": \"how to make millions\
员工目录索引情况
请求体 —— JSON 文档 —— 包含了这位员工的所有详细信息,他的名字叫 John Smith ,今年 25 岁,喜欢攀岩。无需进行执行管理任务,如创建一个索引或指定每个属性的数据类型之类的,可以直接只索引一个文档。Elasticsearch 默认地完成其他一切,因此所有必需的管理任务都在后台使用默认设置完成。}
自定义索引规则
如果你的文档有一个自然的标识符 (例如,一个 user_account 字段或其他标识文档的值),你应该使用如下方式的 index API 并提供你自己 _id :PUT /{index}/{type}/{id}{ \"field\": \"value\
搜索
GET /megacorp/employee/_search此命令搜索所有雇员
数据输入输出
查询特定字段
尝试下搜索姓氏为 ``Smith`` 的雇员。为此,我们将使用一个 高亮 搜索,很容易通过命令行完成。这个方法一般涉及到一个 查询字符串 (query-string) 搜索,因为我们通过一个URL参数来传递查询信息给搜索接口:GET /megacorp/employee/_search?q=last_name:Smith
,查询在 tweet 类型中 tweet 字段包含 elasticsearch 单词的所有文档:GET /_all/tweet/_search?q=tweet:elasticsearch
采用折叠的方式去重是最好的
三个功能模块
字符过滤器首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and。分词器其次,字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。Token 过滤器最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 a, and, the 等无用词),或者增加词条(例如,像 jump 和 leap 这种同义词)。
短语检索且紧挨着
GET /megacorp/employee/_search{ \"query\" : { \"match_phrase\" : { \"about\" : \"rock climbing\" } }}
检索该数据
目前我们已经在 Elasticsearch 中存储了一些数据, 接下来就能专注于实现应用的业务需求了。第一个需求是可以检索到单个雇员的数据。将 HTTP 命令由 PUT 改为 GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT }GET /megacorp/employee/1
yellow含义
副属分片不可用集群的健康状况为 yellow 则表示全部 主 分片都正常运行(集群可以正常服务所有请求),但是 副本 分片没有全部处在正常状态。 实际上,所有3个副本分片都是 unassigned —— 它们都没有被分配到任何节点。 在同一个节点上既保存原始数据又保存副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。
返回
{ \"took\
elasticsearch分片
映射方式不同导致
all类型搜索和date类型搜索结构不一样
只检查是否存在不关心内容
如果只想检查一个文档是否存在--根本不想关心内容—那么用 HEAD 方法来代替 GET 方法。 HEAD 请求没有返回体,只返回一个 HTTP 请求报头:只返回404不返回字段
大块
分布式文档存储
ES介绍
索引分页排序
和 SQL 使用 LIMIT 关键字返回单个 page 结果的方法相同,Elasticsearch 接受 from 和 size 参数:size显示应该返回的结果数量,默认是 10from显示应该跳过的初始结果数量,默认是 0
分布式相关
最终实现
#普通的全文检索GET /lishikai_index007/_search{ \"query\" : { \"match\" : { \"发现人\" : \"朱贵\" } }}#这里可以进行时间过滤GET /lishikai_index007/_search{ \"query\" : { \"bool\": { \"must\": { \"match\" : { \"发现人\" : \"朱贵\
文档中的每个字段都将被索引并且可以被查询 。不仅如此,在简单查询时,Elasticsearch 可以使用 所有(all) 这些索引字段,以惊人的速度返回结果
重要端口
两个 Java 客户端都是通过 9300 端口并使用 Elasticsearch 的原生 传输 协议和集群交互。集群中的节点通过端口 9300 彼此通信。如果这个端口没有打开,节点将无法形成一个集群。注意 版本必须一致Java 客户端作为节点必须和 Elasticsearch 有相同的 主要 版本;否则,它们之间将无法互相理解。
空搜索之后说明
返回结果中最重要的部分是 hits ,它包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。这不像其他的搜索引擎,仅仅返回文档的ID,需要你单独去获取文档。
索引过程以及如何让某个类型不会被索引到
index 属性控制怎样索引字符串。它可以是下面三个值:analyzed首先分析字符串,然后索引它。换句话说,以全文索引这个域。not_analyzed 索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。no不索引这个域。这个域不会被搜索到。string 域 index 属性默认是 analyzed 。如果我们想映射这个字段为一个精确值,我们需要设置它为 not_analyzed :{ \"tag\": { \"type\": \"string\
字符串排序和多字段
创建一个新文档
请记住, _index 、 _type 和 _id 的组合可以唯一标识一个文档。所以,确保创建一个新文档的最简单办法是,使用索引请求的 POST 形式让 Elasticsearch 自动生成唯一 _id :包括已经存在,等等相应,已存在不创建的方法等
故障转移扩容等..
精确搜索和全文搜索
当我们在 _all 域查询 2014,它匹配所有的12条推文,因为它们都含有 2014 :GET /_search?q=2014 # 12 results拷贝为 cURL在 Sense 中查看 当我们在 _all 域查询 2014-09-15,它首先分析查询字符串,产生匹配 2014, 09, 或 15 中 任意 词条的查询。这也会匹配所有12条推文,因为它们都含有 2014 :GET /_search?q=2014-09-15 # 12 results ! 当我们在 date 域查询 2014-09-15,它寻找 精确 日期,只找到一个推文:GET /_search?q=date:2014-09-15 # 1 result 当我们在 date 域查询 2014,它找不到任何文档,因为没有文档含有这个精确日志:GET /_search?q=date:2014 # 0 results !
索引细节
实际上,在 Elasticsearch 中,我们的数据是被存储和索引在 分片 中,而一个索引仅仅是逻辑上的命名空间, 这个命名空间由一个或者多个分片组合在一起。 然而,这是一个内部细节,我们的应用程序根本不应该关心分片,对于应用程序而言,只需知道文档位于一个 索引 内。 Elasticsearch 会处理所有的细节。
multi_match查询
multi_match 查询编辑multi_match 查询可以在多个字段上执行相同的 match 查询:{ \"multi_match\": { \"query\": \"full text search\
内置分析器
但是, Elasticsearch还附带了可以直接使用的预包装的分析器。接下来我们会列出最重要的分析器。为了证明它们的差异,我们看看每个分析器会从下面的字符串得到哪些词条:....分析器语言分析器
不说明字段的查询就是所有内容都查询
当索引一个文档的时候,Elasticsearch 取出所有字段的值拼接成一个大的字符串,作为 _all 字段进行索引。例如,当索引这个文档时:{ \"tweet\": \"However did I manage before Elasticsearch?\
检索分片介绍
Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。
收藏
收藏
0 条评论
下一页