`
hudeyong926
  • 浏览: 2016051 次
  • 来自: 武汉
社区版块
存档分类
最新评论

Elasticsearch全文搜索/大数据分析

阅读更多

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

  • 一个线上商城系统,用户需要搜索商城上的商品。在这里你可以用es存储所有的商品信息和库存信息,用户只需要输入”空调”就可以搜索到他需要搜索到的商品。
  • 一个运行的系统需要收集日志,用这些日志来分析、挖掘从而获取系统业务未来的趋势。你可以用logstash(ELK中的一个产品,elasticsearch/logstash/kibana)收集、转换你的日志,并将他们存储到es中。一旦数据到达es中,就你可以在里面搜索、运行聚合函数等操作来挖掘任何你感兴趣的信息。
  • 如果你有想基于大量数据(数百万甚至数十亿的数据)快速调查、分析并且要将分析结果可视化的需求。你可以用es来存储你的数据,用kibana构建自定义的可视化图形、报表,为业务决策提供科学的数据依据。

安装 elasticsearch

首先确认下jdk有没有安装

java -version

下载源文件,解压,重新建一个用户,将目录的所属组修改为此用户,因为 elasticsearch 无法用 root 用户启动。

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.tar.gz
tar zxvf elasticsearch-6.2.3.tar.gz
useradd elasticsearch 
password elasticsearch
chown elasticsearch:elasticsearch elasticsearch-6.2.3
cd elasticsearch-6.2.3
./bin/elasticsearch  // 启动

连接Elasticsearch:

1、Elasticsearch开启之后,可以直接通过http://127.0.0.1:9200/查看基本信息。

ES的基本用法:ES以RESTFul风格来命名API的, 其API的基本格式如下

http://<ip>:<port>/<索引>/<类型>/<文档id>

ES的动作是以http方法来决定的: 常用的http方法: GET/PUT/POST/DELETE

安装中文分词 elasticsearch-analysis-ik
搜索时,肯定会遇到很尴尬的问题——中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组

 

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。安装Kibana要装与ES相同的版本

sudo wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.3-linux-x86_64.tar.gz
tar -zxvf kibana-6.2.3-linux-x86_64.tar.gz

 

 

使用POSTMAN工具发送PUT请求创建

es支持多字段结构,例如:我们将常用的搜索条件和排序字段(销量,时间)配置到mappings.properties中

{
	"settings":{
		"number_of_shards": 3,
		"number_of_replicas": 1
	},
	"mappings":{
		"man":{
			"properties":{
				"word_count":{
					"type": "integer"
				},
				"author":{
					 "type": "keyword"
				},
				"title":{
					"type": "text"
				},
				"publish_date":{
					"type": "date",
					"format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || epoch_millis"
				}
			}
		}
	}
}

如下图

观察返回结果已经成功。

插入文档:PUT 127.0.0.1:9200/people/man

{
    "name": "chenjie",
    "country": "China",
    "age": 30,
    "date": "1994-09-27"
}
修改文档:POST 127.0.0.1:9200/people/man/1/_update
{
    "doc":{
         "name":"chenjie_update"
     }
}
删除文档
DELETE 127.0.0.1:9200/people/man/1

 

使用PHPAPi构建和查询

创建表和测试数据,索引相当于MySQL中的表,文档相当于 MySQL 中的行记录。程序在新增/修改/删除记录的时候调用ES的接口对ES文档进行同步的新增/修改/删除操作。同步构建有很大缺陷。比如:ES宕机或者ES处理文档消耗了很长的时间影响用户的体验。可以使用KaFka中间件来进行异步构建文档。

CREATE TABLE articles ( id INT NOT NULL PRIMARY KEY auto_increment, title VARCHAR ( 200 ) NOT NULL COMMENT '标题', content text COMMENT '内容' );
INSERT INTO articles ( title, content )
VALUES
( 'Laravel 测试1', 'Laravel 测试文章内容1' ),
( 'Laravel 测试2', 'Laravel 测试文章内容2' ),
( 'Laravel 测试3', 'Laravel 测试文章内容3' );

实例化

require './vendor/autoload.php';
use Elasticsearch\ClientBuilder;
$client = ClientBuilder::create()->build();

elasticsearch的动态性质,在添加第一个文档的时候自动创建了索引和一些默认设置。

创建索引

$params['index'] = 'articles_index';
$params['body']['settings']['number_of_shards'] = 2;
$params['body']['settings']['number_of_replicas'] = 0;
$client->indices()->create($params);

将文档加入索引

foreach ($lists as $row) {
    $params = [
        'body' =>
            [
                'id' => $row['id'],
                'title' => $row['title'],
                'content' => $row['content']
            ],
        'id' => 'article_' . $row['id'], //maping db id
        'index' => 'articles_index',
        'type' => 'articles_type'
    ];
    $client->index($params);
}

 从索引中获取文档

$params = ['index' => 'articles_index', 'type' => 'articles_type', 'id' => 'articles_1'];
$res = $client->get($params);
print_r($res);
删除索引
$params = [
    'index' => 'articles_index'
];
$res = $client->indices()->delete($params);
print_r($res);
搜索文档,如果需要获取更多明细信息可以根据mysql表ID获取
<?php
$params = ['index' => 'articles_index', 'type' => 'articles_type'];
$params['body']['query']['match']['content'] = 'Laravel';
$params['body']['size'] = 10;
$params['body']['from'] = 200;
$params['body']['sort'] = ['content' => ['order' => 'desc']];
$res = $client->search($params);
print_r($res);
//相当于sql语句:select * from articles where content='Laravel' limit 200,10 order by content desc; 
从索引中删除文档
$params = ['index' => 'articles_index', 'type' => 'articles_type', 'id' => 'articles_1'];
$res = $client->delete($params);
print_r($res);

 

Elasticsearch更新和删除文档的过程。

  • 删除和更新也都是写操作,但是Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更;
  • 磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。
  • 在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。

ElasticSearch搜索term和terms的区别

在查询的字段只有一个值的时候,应该使用term而不是terms,在查询字段包含多个的时候才使用terms(类似于sql中的in、or),使用terms语法,JSON中必须包含数组。

第一种(单个值,term):

{
    "query":{
        "bool":{
            "must":[
                {
                    "range":{
                        "update_time":{
                            "gt":"1488556800000"
                        }
                    }
                },
                {
                    "term":{
                        "lang":1
                    }
                },
                {
                    "terms":{
                        "domain":[
                            "dailymasala.co",
                            "goldenmob.com"
                        ]
                    }
                },
                {
                    "prefix":{
                        "user_id":"errVideo_setInterval_"
                    }
                }
            ]
        }
    },
    "from":0,
    "size":10
}

 第二种(数组形式,terms):

{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "update_time": {
              "gt": "1488556800000"
            }
          }
        },
        {
          "terms": {
            "lang": [1]
          }
        },
        {
          "terms": {
            "domain": [
              "dailymasala.co",
              "goldenmob.com"
            ]
          }
        },
        {
          "prefix": {
            "user_id": "errVideo_setInterval_"
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 10
}

elasticsearch 中term与match区别

term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词,所以我们的搜索词必须是文档分词集合中的一个。比如说我们要找标题为北京奥运的所有文档

match查询会先对搜索词进行分词,分词完毕后再逐个对分词结果进行匹配,因此相比于term的精确搜索,match是分词匹配搜索。要搜索词的分词集合中的一个或多个存在于文档中即可,例如,当我们搜索中国杭州,搜索词会先分词为中国杭州,只要文档中包含搜索杭州任意一个词,都会被搜索到。对于match搜索,可以按照分词后的分词集合的or或者and进行匹配,默认为or

curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
    "query": {
        "match": {
            "content": {
                "query": "中国世界",
                "operator": "and"
            }
        }
    }
}'

ES性能优化

{
    "settings":{
        "number_of_shards": 3,
        "number_of_replicas": 1,
        "index.store.type": "niofs",
        "index.query.default_field": "content",
        "index.unassigned.node_left.delayed_timeout": "5m",
    },
    "mappings":{
        "man":{
            "dynamic":true,
            "_all":{"enabled":false},
            "properties":{
            }
        }
    }
}

安全控制可以使用apache/nginx的http认证

  • 大小: 44.7 KB
分享到:
评论

相关推荐

    十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统.pdf

    Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能。 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索领域,但是操作复杂繁琐,总是让开发者敬而远之。而 Elasticsearch将 Lucene 作为...

    《Elasticsearch集成Hadoop最佳实践》

    通过Kibana技术,Elasticsearch Hadoop很容易从Hadoop 生态系统中获得大数据分析的结果。 本书全面介绍Elasticsearch Hadoop技术用于大数据分析以及数据可视化的方法。内容共分7章,包括Hadoop、Elasticsearch、 ...

    Elasticsearch集成Hadoop最佳实践

    通过Kibana技术,Elasticsearch Hadoop很容易从Hadoop 生态系统中获得大数据分析的结果。本书全面介绍Elasticsearch Hadoop技术用于大数据分析以及数据可视化的方法。内容共分7章,包括Hadoop、Elasticsearch、 ...

    elasticsearch-7.17.6及对应版本IK分词

    Elasticsearch 为所有类型的数据提供近乎实时的搜索和分析。无论您拥有结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch 都能以支持快速搜索的方式高效地存储和索引它。您可以超越简单的数据检索和...

    elasticsearch windows 7.17.16 解压安装包

    Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的...

    ElasticSearch分布式搜索引擎是一个分布式的RESTful风格的搜索和数据分析引擎,能够解决越来越多的用例.rar

    ElasticSearch分布式搜索引擎是一个分布式的RESTful风格的搜索和数据分析引擎,能够解决越来越多的用例。作为Elastic Stack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。 Elasticsearch是一...

    elasticsearch权威指南示例数据

    Elasticsearch 是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、分析以及这三个功能的组合: Wikipedia 使用 Elasticsearch 提供带有...

    ElasticSearch5.2全网最全技术视频

    (1)涵盖Elasticsearch目前最核心的两个应用领域,垂直搜索引擎,实时数据分析 (2)开发出2个企业级的大型复杂项目,是完全真实的大型企业项目,电商搜索引擎,电商实时数据分析平台 (2-1)大型电商搜索引擎,...

    bitnami-docker-elasticsearch:用于Elasticsearch的Bitnami Docker映像

    Elasticsearch是一个高度可扩展的开源全文本搜索和分析引擎。 它使您可以快速,近乎实时地存储,搜索和分析大量数据 TL; DR $ docker run --name elasticsearch bitnami/elasticsearch:latest Docker撰写 $ curl -...

    Elasticsearch(elasticsearch-7.16.2-aarch64.rpm)

    Elasticsearch(elasticsearch-7.16.2-aarch64.rpm适用于Linux arm x86_64)是一个高度可扩展的开源全文本搜索和分析引擎。它使您可以快速,近乎实时地存储,搜索和分析大量数据。它通常用作支持具有复杂搜索功能和...

    elasticsearch-6.7.0

    Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。Elasticsearch是一个...

    Elasticsearch顶尖高手系列课程-核心知识篇-课程资料.zip

    相对于Spark Streaming、Storm等大数据实时计算引擎来说,Elasticsearch天生为分布式执行数据分析操作而生的架构,海量数据量级下的近实时(秒级)性能支持,以及无比强大的搜索和聚合分析的语法支持,让ES更加适合...

    ElasticSearch分布式搜索引擎 v7.9.0

    为您提供ElasticSearch分布式搜索引擎下载,Elasticsearch是一个分布式的RESTful风格的搜索和数据分析引擎,能够解决越来越多的用例。作为Elastic Stack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外...

    Elasticsearch分布式搜索模型的实际应用小案例

    它提供了一套强大的API和工具,可以实现分布式全文搜索、结构化和非结构化数据分析、日志存储和实时数据可视化等功能。 以下是一些Elasticsearch的关键特性和概念: 分布式架构:Elasticsearch使用分布式架构,...

    elasticsearch-7.6.0-windows-x86_64.rar es工具

    Elasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎。Elasticsearch还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,ES能够横向扩展至数以百计...

    Elasticsearch(elasticsearch-7.17.0-arm64.deb )

    Elasticsearch(elasticsearch-7.17.0-arm64.deb 适用于deb Arm )是一个高度可扩展的开源全文本搜索和分析引擎。它使您可以快速,近乎实时地存储,搜索和分析大量数据。它通常用作支持具有复杂搜索功能和要求的应用...

    Elasticsearch-7.8.0.zip

    Elasticsearch是一个高度可扩展的开源全文本搜索和分析引擎。它使您可以快速,近乎实时地存储,搜索和分析大量数据。它通常用作支持具有复杂搜索功能和要求的应用程序的基础引擎/技术。 elasticsearch-7.8.0-linux-...

    Elasticsearch总结.doc

    Elasticsearch的特性 分布式、全文检索、近实时搜索和分析、高可用、模式自由、restful 讲述Elasticsearch的架构和Elasticsearch 的核心 概念 二、索引数据 单词 文档矩阵,倒排索引,倒排索引实例,单词词典 三、...

    Elasticsearch(elasticsearch-8.2.0-arm64.deb )

    Elasticsearch(elasticsearch-8.2.0-arm64.deb ),适用于deb Arm :它是一个高度可扩展的开源全文本搜索和分析引擎。它使您可以快速,近乎实时地存储,搜索和分析大量数据。它通常用作支持具有复杂搜索功能和要求...

Global site tag (gtag.js) - Google Analytics