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

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示例数据 logs.json shakespeare.json accounts.json

    Elasticsearch是一款强大的开源搜索引擎,广泛应用于大数据分析和实时搜索领域。它基于Lucene库,提供了分布式、可扩展、近实时的搜索与分析能力。在本案例中,我们关注的是三份示例数据文件——`logs.json`, `...

    ElasticSearch官方测试数据

    Elasticsearch(ES)是一种流行的开源全文搜索引擎,它基于Lucene库构建,被广泛用于大数据分析、日志聚合、实时搜索和索引等场景。官方提供的测试数据集是检验Elasticsearch功能、性能和稳定性的关键资源,可以帮助...

    最新版linux elasticsearch-7.14.0-linux-x86_64.tar.gz

    Elasticsearch是一个开源的全文搜索引擎,广泛应用于大数据分析和实时搜索场景。它的最新版本为7.14.0,这是专为Linux x86_64架构设计的。在这个版本中,Elasticsearch提供了一系列增强的功能和性能优化,旨在提高...

    Elasticsearch 一个开源的搜索和数据分析引擎

    ### Elasticsearch:开源搜索和数据分析引擎 #### 一、概述 Elasticsearch 是一款基于 Apache Lucene 开发的开源搜索引擎和数据分析平台。它以其强大的搜索能力、高性能的数据处理速度以及易于扩展的特点,在大...

    ES查询客户端,elasticsearch可视化工具 elasticsearch查询客户端

    作为分布式、RESTful风格的搜索和数据分析引擎,Elasticsearch能够提供实时、高可用性以及可扩展的搜索功能。在进行日常的数据操作时,为了方便地与ES进行交互,我们通常会使用查询客户端和可视化工具。 **1. ...

    elasticsearch安装和使用

    Elasticsearch是一个开源的全文搜索引擎,它以其高效、可扩展的特性被广泛应用于数据分析、日志分析、网站搜索等领域。本文将详细介绍Elasticsearch的安装、配置以及与Spring的整合,还会涉及Elasticsearch的curl...

    Elasticsearch全文搜索引擎

    **Elasticsearch 全文搜索引擎** Elasticsearch是一款开源、分布式的全文搜索引擎,以其高效、灵活和可扩展性在IT行业中赢得了广泛的认可。它基于Lucene库构建,但提供了更高级别的API和集群管理功能,使得数据搜索...

    Elasticsearch2.4.4免安装下载

    Elasticsearch 的核心功能包括全文搜索、数据分析以及实时性能。在全文搜索方面,它采用了倒排索引技术,使得搜索速度极快。在数据分析上,Elasticsearch 支持多种数据类型,如文本、数字、日期和地理位置,并且具备...

    elasticsearch 8.11.3 windows安装包

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

    elasticsearch未授权访问 漏洞修复

    Elasticsearch 是一个流行的开源全文搜索引擎,常用于大数据分析和实时数据检索。然而,如果没有正确配置安全设置,它可能会暴露于未授权访问的风险中,这可能导致数据泄露或恶意操作。本文将详细讲解如何修复 ...

    Elasticsearch全文检索

    除了基础操作,Elasticsearch还提供许多高级特性,如聚合分析(Aggregations)用于统计分析,脚本字段(Script Fields)用于动态计算字段,以及实时数据分析(Real-time Analytics)等功能。 在` ESDemo `项目中,...

    人工智能-项目实践-搜索引擎-SpringBoot+ElasticSearch全文搜索引擎

    Elasticsearch则是一个分布式、开源的搜索和分析引擎,特别适合实时数据分析和大规模数据索引。它使用倒排索引技术,使得全文搜索变得高效。Elasticsearch具有高可扩展性和容错性,是构建搜索引擎的理想选择。 在...

    Elasticsearch搭建文档.docx

    Elasticsearch是一个基于Apache Lucene的搜索和数据分析引擎。下面我们将从头开始搭建一个Elasticsearch系统,并讨论其安装、配置和运行过程。 1. Elasticsearch的安装 Elasticsearch的安装可以通过两种方式进行:...

    CentOS 7 部署 Elasticsearch7.4 集群并进行安全认证.docx

    Elasticsearch 是一个基于 Lucene 库的搜索和数据分析引擎,它提供了一个分布式的搜索引擎,可以对大规模数据进行搜索、分析和可视化。在本文中,我们将了解如何在 CentOS 7 上部署 Elasticsearch 7.4 集群,并进行...

    java操作elasticsearch5.x的demo

    在大数据时代,Elasticsearch作为一个高效、可扩展的全文搜索引擎,被广泛应用于日志分析、实时监控、数据挖掘等领域。本篇文章将详细解析如何使用Java API来操作Elasticsearch 5.x版本,帮助你快速上手。 一、...

    elasticsearch windows 7.17.16 解压安装包

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

    elasticsearch2.4.6

    Elasticsearch 是一个开源的、基于 Lucene 的全文搜索引擎,它提供了一个分布式、RESTful 风格的搜索和数据分析引擎,用于处理海量数据,特别是对于日志管理和实时分析场景。版本 2.4.6 是 Elasticsearch 的一个重要...

    基于ElasticSearch的分布式全文搜索系统.pdf

    从文件描述来看,这篇文章的目的是为了提高海量及复杂数据的访问效率,在对ElasticSearch搜索引擎框架分析的基础上,设计并实现了分布式全文搜索系统。系统包含三个主要的模块:数据接入、数据索引和全文搜索。数据...

    elasticsearch-bulk-insert-plugin.zip

    Elasticsearch是一种流行且功能强大的分布式搜索引擎,常用于大数据分析、日志分析、全文检索等场景。Kettle,又称Pentaho Data Integration(PDI),是一款开源的数据集成工具,它提供了ETL(提取、转换、加载)...

    elasticsearch 7.17.16 linux 解压安装包

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

Global site tag (gtag.js) - Google Analytics