Manning.Elasticsearch.in.Action.2nd.Edition.2023.9

作者:Madhusudhan Konda

1.2 Search is the new normal

数据主要分为两种:结构化数据和非结构化数据。这两类数据之间的根本区别在于数据的存储和分析方式。结构化数据遵循预定义的模式/模型,而非结构化数据则是自由形式、无组织的,没有模式。


也就是说,我们关心的是找到与搜索标准相匹配的文档——而不是它们匹配得有多好


相关性是指搜索引擎的结果与用户查询的匹配程度。它是一种机制,用于指示结果与原始查询的匹配程度。搜索引擎使用相关性算法来确定哪些文档与用户的查询密切相关(即,它们有多相关),并根据结果与查询的匹配程度为每个结果生成一个正数,称为相关性分数


除了结构化和非结构化数据,还有另一种类别:半结构化数据。这种数据基本上介于结构化和非结构化数据之间。它只不过是一些元数据描述的非结构化数据。

1.2.2 Search supported by a database

Elasticsearch使用相似性算法为全文查询生成相关性得分。得分是附加在结果上的正浮点数,得分最高的文档表示与查询标准更相关。Elasticsearch高效地处理结构化和非结构化数据。其关键功能之一是能够在同一个索引中索引和搜索结构化和非结构化数据

1.2.3 Databases vs. search engines

索引和搜索性能——全文搜索需要高效的索引和性能良好的搜索和分析功能,而传统数据库没有优化这些功能。数据库可能难以索引大量数据,因此可能表现出较差的查询性能。像Elasticsearch和Solr这样的搜索引擎专门设计用于处理大量文本数据,并提供近实时的搜索结果。搜索引擎可以处理大规模数据,比传统数据库更快地索引和搜索数据,因为它们基本上是为优化搜索操作而设计的。不幸的是,关系数据库缺乏高级搜索功能,如模糊逻辑、词干、同义词等。

1.3.1 Functionality

虽然市场上有一些搜索引擎可用,但我只提其中三个,它们都构建在Apache Lucene之上。下面几节将介绍Elasticsearch、Solr和OpenSearch。


Solr和Elas-ticsearch都擅长全文搜索;然而,Elasticsearch在分析方面可能更有优势。

1.4 Elasticsearch overview

Solr是在大数据生态系统中工作的大型静态数据集的最爱


Elastic在2021年更改了其许可政策。适用于Elastic-search 7.11及以上版本的许可证已经从开源转移到Elastic License和SSPL下的双重许可证。该许可证允许社区免费使用产品,但托管服务提供商不能再将产品作为服务提供。当亚马逊网络服务(AWS)创建了一个名为Open Distro for Elasticsearch的分支版本并将其作为托管服务提供时,Elastic和AWS之间发生了争执。这场争吵导致了许可证的改变,最终导致了OpenSearch的诞生


OpenSearch的基本代码是从开源的Elasticsearch和Kibana版本7.10.2。该产品的第一个通用可用性版本1.0于2021年7月发布。当心OpenSearch在搜索引擎领域成为Elasticsearch的竞争对手


Elasticsearch通过提供一个带有RESTful接口的分布式系统来包装Lucene的强大功能。Lucene是Elasticsearch的动力源泉,而Kibana是管理和使用Elasticsearch的管理UI

1.4.1 Core areas

Elasticsearch背后的公司Elastic一直将自己定位在三个核心领域:搜索、可观察性和安全性

1.4.2 Elastic Stack

Elasticsearch是搜索引擎的核心,一些Elasticsearch产品是它的补充。这套产品被称为Elastic Stack,包括Kibana、Log-stash、Beats和Elasticsearch

1.4.4 Unsuitable Elasticsearch uses

Elasticsearch不是适合搜索具有关系且需要执行复杂数据库连接的数据的工具


它不适合需要立即一致性的应用,如金融交易


不是大规模地理空间分析的最有效解决方案。对于这些用例,可以考虑使用专用的地理空间数据库(如PostGIS)或地理空间分析平台(如ArcGIS)。


它不是针对高写入工作负载进行优化的.如果需要实时索引大量数据,可以考虑使用专用的索引引擎,如Apache Flume或Apache Kafka。


在线分析处理(OLAP)数据-如果您需要对大型数据集执行复杂的多维分析,传统的OLAP数据库(如Micro-soft Analysis Services或IBM Cognos)可能比Elasticsearch更适合。


它可能不是索引和搜索大型二进制数据(如视频或图像)的最佳解决方案。对于这些用例,请考虑使用专用的二进制数据存储,如Hadoop分布式文件系统(HDFS)、Amazon S3或Azure Files。


它可能不是实时数据处理和分析的最有效的解决方案。相反,考虑一个专门的实时分析平台,比如ApacheSPark或ApacheFlink。


弹性搜索被设计用于处理大容量搜索和分析查询,但在处理大量数据时仍然存在延迟问题。对于需要亚毫秒级响应时间的应用程序,像Apache Solr这样的专门搜索引擎或像Apache Cassandra这样的柱形数据库可能更适合。


如果需要存储和分析时间序列数据,InfluxDB或TimescaleDB等专门的时间序列数据库可能更适合。类似地,像Neo4j这样的图形数据库可以帮助您处理图形数据。

1.4.5 Misconceptions

Elasticsearch的常见误解


Elasticsearch易于设置和管理。虽然Elasticsearch的设置和使用相对简单,但随着数据的增长和用例的增加,其管理和扩展可能具有挑战性。虽然一切都开箱即用,使工程师的生活变得轻松,但将Elasticsearch引入生产环境需要付出努力。随着数据的增长,我们可能需要调整配置和微调内存,管理节点故障,甚至缩放集群以处理千兆字节的数据。


Elasticsearch不是一个关系数据库,不支持传统的关系数据库特性,如事务、交换键和复杂的连接操作。例如,我们不能在Elasticsearch中强制引用完整性或执行复杂的连接操作


它可能不是实时数据处理和分析或处理大型二进制数据的最佳解决方案。如果您需要存储和处理视频或图像等大型二进制数据,请考虑使用HDFS或Amazon S3等专用二进制数据存储。


虽然Elasticsearch非常适合文本搜索,但它也可以对结构化和非结构化数据进行复杂的分析。例如,我们可以使用Elasticsearch执行聚合,分析日志数据,并使用Kibana可视化数据。

Summary

Elastic Stack是由Beats、Logstash、Elastic-search和Kibana组成的一套产品。Beats是单一用途的数据传送器,Logstash是数据处理ETL(提取、转换、加载)引擎,Kibana是管理UI工具,而Elasticsearch是堆栈的核心和灵魂。

2.2.1 Counting documents

GET books/_doc/1


GET books/_search{“query”: {“ids”: {“values”: [1,2,3] }}}


在请求中设置标志“_source”:false,以完全禁止在响应中发送源数据


GET books/_search{“_source”: false, “query”: {“ids”: {“values”: [1,2,3] }}}


GET books/_search


GET books/_search{“query”: {“match_all”: { } }}

_match查询有助于在非结构化文本或全文中搜索单词。下面的查询搜索由“Joshua”编写的书籍。


GET books/_search{“query”: {“match”: {“author”: “Joshua” }}}

2.3.2 Match query with the AND operator

我们可以将匹配查询更改为前缀查询


GET books/_search{“query”: {“prefix”: {“author”: “josh” }}}


GET books/_search{“query”: {“match”: {“author”: “Joshua Schildt” }}}


GET books/_search{“query”: {“match”: {“author”: { “query”: “Joshua Schildt”, “operator”: “AND”}}}}


默认为OR

2.3.3 Indexing documents using the _bulk API

有一个方便的_bulk API可以让我们同时索引文档。当索引多个文档时,我们可以使用Kibana或cURL来执行_bulk API,但这两种方法在数据格式上存在差异

2.3.4 Searching across multiple fields

跨多个字段的搜索….GET books/_search{“query”: {“multi_match”: { “query”: “Java”, “fields”:[“title”,”synopsis”] }}}

2.3.5 Boosting results

GET books/_search{“query”: {“multi_match”: { “query”: “Java”, “fields”:[“title^3”,”synopsis”] } }}