【安装】ES的安装过程
1.安装ES
首先我们需要去官网下载安装包 官方下载地址
下载后不需要编译,直接解压
解压后结构是这样的(2.5以上版本会有plugins目录,没有的需要手动创建)

方式一:
创建一个es用户(因为es不允许使用root用户启动)
useradd es
将该目录权限修改为es用户所有
chown es:es -hR .
所有要作为es节点的机器都要执行以上操作
***********
以下亲测
***********
#添加一个用户:elasticsearch
$useradd elasticsearch
#给用户elasticsearch设置密码,连续输入2次
$passwd elasticsearch
#创建一个用户组 es
groupadd es
#分配 elasticsearch 到 es 组
usermod -G elasticsearch es
#这里注意下,如果提示用户“es”不存在,那么是因为服务器版本问题,你可以换成 usermod -G es elasticsearch ,也就是用户和用户组对调一下使用。
#在elasticsearch 根目录下,给定用户权限。-R表示逐级(N层目录) , * 表示 任何文件
chown -R elasticsearch.es *
#赋予文件执行读写权限
chmod -R 755 bin/*
#切换到elasticsearch用户
su elasticsearch
方式二:(2.4.2版本不好使)
用vi打开elasicsearch执行文件,在变量ES_JAVA_OPTS使用前添加以下命令
ES_JAVA_OPTS="-Des.insecure.allow.root=true"
方式三:(2.4.2版本不好使)
在执行elasticSearch时加上参数-Des.insecure.allow.root=true,完整命令如下
./elasticsearch -Des.insecure.allow.root=true
2.安装插件
ES的插件都是要安装到 es安装目录/plugins/ 下
1.elasticsearch-head
这是一个elasticsearch的集群管理工具,它是完全由HTML5编写的独立网页程序,通过这个插件可以可视化监控ES。
官网:https://github.com/mobz/elasticsearch-head
(备注)安装方式:
在elasticsearch-2.4.2/bin下执行
./plugin install mobz/elasticsearch-head
再访问http://<ipaddress>:9200/_plugin/head/
2.中文分词器 ik
官网 https://github.com/medcl/elasticsearch-analysis-ik

这里默认的是master的 但是master的项目需要用gradle编译,这里选择1.8.0版本。而且从下面的介绍可以知道1.8.0正好对应elasticsearch的2.2.0版本
下载后的压缩包解压后进去发现是pom工程
然后用maven编译
#mvn clean #mvn compile 编译源代码 #mvn package
成功后安装包在target/releases/elasticsearch-analysis-ik-x.x.x.zip
将这个压缩包解压到es的插件的对应目录下即可(plugins/ik)。
最后 重启ES集群
3.elasticsearch-analysis-pinyin 分词器
4.nGram
我们用ik分词器的时候,检索的时候会把搜索词进行分词然后检索。如
搜索 “我们的生活”,优先是包含这5个字的,但是也会返回包含“我们”和“生活”的数据。
但是有时候我们不需要这么智能,只需要完全匹配的进行搜索。这就需要用到ngram了。(不需要单独安装,只需要设置settings即可)
先上一个例子
POST
url : localhost:9200/ngramtest
Content-Type: application/json
{
"settings": {
"analysis": {
"analyzer": {
"charSplit": {
"type": "custom",
"tokenizer": "my_ngram_tokenizer",
"filter":["lowercase"]
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "nGram",
"min_gram": "2",
"max_gram": "4",
"token_chars": ["letter","digit","punctuation"]
}
}
}
},
"mappings": {
"myType": {
"dynamic": "strict",
"properties": {
"content": {
"type": "string",
"analyzer": "charSplit",
"search_analyzer": "charSplit"
}
}
}
}
}
属性settings.analysis.tokenizer下面的 my_ngram_tokenizer 对象是自定义的tokenizer
settings.analysis.analyzer.charSplit 则是基于 my_ngram_tokenizer 的自定义分词器
关于my_ngram_tokenizer 中的属性:
min_gram:单个词的最小长度,默认1
max_gram:单个词的最大长度,默认2
token_chars:可以接受的字符集(即遇到不在列表中的字符集会进行文本分割)
字符集包括
letter 字母或汉字 a, b, ï or 京
digit 数字 3 or 7
whitespace 空白(空格、回车、tab等) " " or "\n"
punctuation 标点符号 ! , 。or "
symbol 标志(区别于标点符号) $ or √
可以从下面的例子了解一下
配置片段 "token_chars": ["letter","digit","punctuation"]
即接收文字数字和标点,那现在我在内容中添加symbol标记 $
POST 192.168.5.222:9200/yuqingtest/_analyze?pretty&analyzer=charSplit
商业核心和$标准化技术
返回结果
{
"tokens": [
{
"token": "商业核",
"start_offset": 0,
"end_offset": 3,
"type": "word",
"position": 0
},
{
"token": "商业核心",
"start_offset": 0,
"end_offset": 4,
"type": "word",
"position": 1
},
{
"token": "业核心",
"start_offset": 1,
"end_offset": 4,
"type": "word",
"position": 2
},
{
"token": "业核心和",
"start_offset": 1,
"end_offset": 5,
"type": "word",
"position": 3
},
{
"token": "核心和",
"start_offset": 2,
"end_offset": 5,
"type": "word",
"position": 4
},
{
"token": "标准化",
"start_offset": 6,
"end_offset": 9,
"type": "word",
"position": 5
},
{
"token": "标准化技",
"start_offset": 6,
"end_offset": 10,
"type": "word",
"position": 6
},
{
"token": "准化技",
"start_offset": 7,
"end_offset": 10,
"type": "word",
"position": 7
},
{
"token": "准化技术",
"start_offset": 7,
"end_offset": 11,
"type": "word",
"position": 8
},
{
"token": "化技术",
"start_offset": 8,
"end_offset": 11,
"type": "word",
"position": 9
}
]
}
可以看到$分割开了左右的词
3.配置
配置文件只需要改动config/elasticsearch.yml 的几个地方
cluster.name: my-es-cluster
node.name: sdp0.xx.cn
path.repo: ["/opt/module/elasticsearch-2.x.x/backup"]
network.host: 192.168.0.xxx
discovery.zen.ping.unicost.hosts: ["192.168.0.xxx", "192.168.0.xxx", "192.168.0.xxx", "192.168.0.xxx"]
//http.port: 9200 不需要设置端口,默认http就是9200,浏览器访问
//transport.tcp.port: 9300 默认tcp端口是9300,程序访问
要注意的是 yml类型的配置文件 冒号后面必须要有一个空格 否则读取的时候会认为格式不正确
启动
#先进入ES安装路径su es //切换到之前创建的es用户
bin/elasticsearch(前台运行)
#bin/elasticsearch -d(后台运行)
如果提示版本不一致,修改plugins/ik/plugin-descriptor.properties ,对应的2.2.0改为2.4.2
在浏览器上输入 http://<IP>:9200/
{
"name" : "myhost",
"cluster_name" : "my-es-cluster",
"cluster_uuid" : "UZHnaRT7R06kBjKh6Qbzvg",
"version" : {
"number" : "2.4.2",
"build_hash" : "161c65a337d4b422ac0c805f284565cf2014bb84",
"build_timestamp" : "2017-03-17T11:51:03Z",
"build_snapshot" : false,
"lucene_version" : "5.5.2"
},
"tagline" : "You Know, for Search"
}
看到以上结构内容则表明安装配置成功
Java调用还需配置本机映射
修改C:\Windows\System32\drivers\etc\hosts文件增加映射配置
192.168.193.129 sdp1.sarnath.cn
192.168.0.37 sdp3.sarnath.cn
192.168.0.38 sdp4.sarnath.cn
192.168.0.39 sdp5.sarnath.cn
CURL命令
index
#创建index
curl -XPUT http://192.168.5.222:9200/index_name/#删除index
curl -XDELETE http://192.168.5.222:9200/index_name/#查看index
curl -XGET http://192.168.5.222:9200/index_name/
type
#新增/更新Type(不在url的最后指定id的话,es会自动生成id)
curl -XPOST http://192.168.5.222:9200/index_name/emp/1 -d '{"first_name" : "John","age" : 25,"about" : "I love to go rock climbing","interests": ["sports","music"]}'#根据ID删除
curl -XDELETE http://192.168.5.222:9200/index_name/emp/1#检索Type
curl -XGET http://192.168.5.222:9200/index_name/emp/1?pretty#查询所有字段
curl –XGET http://192.168.5.222:9200/index_name/emp/1/_source#只返回部分字段
curl -XGET http://192.168.5.222:9200/index_name/emp/1?_source=name,age#返回所有数据
curl -XGET http://192.168.5.222:9200/index_name/emp/_search#简单的条件查询
curl -XGET http://192.168.5.222:9200/index_name/emp/_search?q=first_name:Smith#条件删除
curl -XDELETE 'http://localhost:9200/index_name/emp,user/_query?q=user:kimchy'
#查看分词情况
curl -XPOST http://192.168.5.222:9200/index_name/_analyze?pretty&analyzer=charSplit -d '商业核心和$标准化技术'
type的复杂查询(DSL),这种查询同时支持GET和POST,不过使用CURL命令来POST数据太不直观,我都是使用Postman
#新增type
POST 192.168.5.222:9200/yuqingtest/article/
Content-Type: application/json
{
"title" : "政协副主席建议提高境外黑匣子",
"content" : "使用了商业核心和$标准化技术,相比以前的非标$准化方案,更容易维护和支持哈哈有个黑匣子在外面。"
}
#查询(查询相关语句太多)
{
"query": {
"multi_match": {
"query": "黑匣子",
"type": "phrase",
"slop": 1,
"fields": [
"content"
],
"max_expansions": 1
}
},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
},
"sort":{
"createTime":{"order":"esc"}
}
}
JAVA API
ES官方提供的Javaapi用起来不是很方便(org.elasticsearch.elasticsearch)
用spring的封装版就好得多(org.springframework.data.spring-data-elasticsearch),尤其是结合springboot后,精简了配置等相关操作,开发效率更是提升
pom的依赖以及配置参考 Springboot结合elasticsearch,下面只看重点
略过ArticleEntity
Repo
public interface ArticleRepository extends ElasticsearchRepository<ArticleEntity, String> {
}
增删改查例子
package com.ray.estest;
import java.util.ArrayList;import java.util.List;import java.util.Map;
import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.index.query.BoolQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.index.query.RangeQueryBuilder;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.highlight.HighlightBuilder.Field;import org.elasticsearch.search.highlight.HighlightField;import org.elasticsearch.search.sort.SortBuilder;import org.elasticsearch.search.sort.SortBuilders;import org.elasticsearch.search.sort.SortOrder;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Pageable;import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;import org.springframework.data.elasticsearch.core.SearchResultMapper;import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;import org.springframework.data.elasticsearch.core.query.SearchQuery;
import com.product.yq_common.utils.StringUtils;import com.product.yq_service.entity.input.ArticleDetailInput;import com.product.yq_service.entity.input.ArticleQueryEntity;import com.product.yq_service.entity.output.ArticleSummaryInfoEntity;import com.product.yq_serviceimpl.entity.ArticleEntity;import com.product.yq_serviceimpl.repo.ArticleRepository;/**
* @author Ray
* 2017年3月30日
*/public class ArticleServiceImpl {
@Autowired
private ArticleRepository repo;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
public Object getArticles(ArticleQueryEntity entity) throws Exception {
List<ArticleSummaryInfoEntity> articles = new ArrayList<ArticleSummaryInfoEntity>();
// 分页
Pageable pager = new PageRequest(0, 10);
// 构建查询语句
BoolQueryBuilder qb = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("deleted", false))
.must(QueryBuilders.termQuery("name", "Zhang"))// term一般用于not_analyzed
.must(QueryBuilders.matchQuery("favorite", entity.getType()));// match则用于analyzed
// 拼接条件
if (!StringUtils.isEmpty(entity.getSearchWord())) {
// multiMatchQuery 混合查询 同时检索多个字段
qb = qb.must(QueryBuilders.multiMatchQuery(entity.getSearchWord(), "title", "summary"));
}
if (!StringUtils.isEmpty(entity.getStartDate()) || !StringUtils.isEmpty(entity.getEndDate())) {
// 区间查询 gt,lt,gte,lte,from-to,
RangeQueryBuilder rqb = QueryBuilders.rangeQuery("createDate");
if (!StringUtils.isEmpty(entity.getStartDate())) {
rqb = rqb.gte(entity.getStartDate());
}
if (!StringUtils.isEmpty(entity.getEndDate())) {
rqb = rqb.lte(entity.getEndDate());
}
qb = qb.must(rqb);
}
// 排序(最好不要用字符串类型的Field做排序)
SortBuilder sort = SortBuilders.fieldSort("createTime").order(SortOrder.DESC);
// 开始组装
SearchQuery query = new NativeSearchQueryBuilder().withQuery(qb).withSort(sort).withPageable(pager).build();
// 返回的是带有分页数据的对象
Page<ArticleEntity> entities = repo.search(query);
long total = entities.getTotalElements();
int pages = entities.getTotalPages();
List<ArticleEntity> rst = entities.getContent();
return rst;
}
/**
* 更新
*/
public void update(ArticleDetailInput entity) throws Exception {
ArticleEntity oriES = repo.findOne(entity.getArticleId());
oriES.setTitle(entity.getTitle());
oriES.setContent(entity.getContent());
repo.save(oriES);
}
/**
* 添加
*/
public String add(ArticleDetailInput entity) throws Exception {
ArticleEntity oriES = new ArticleEntity();
oriES.setTitle("这是title");
oriES.setContent("这是content");
oriES = repo.save(oriES);
return oriES.getArticleId();// articleId映射ES中的ID }
/**
* 获取详情
*/
public Object detail(String id) throws Exception {
return repo.findOne(id);
}
/**
* 删除
*/
public void delete(String id) throws Exception {
repo.delete(id);
}
/**
* 根据关键词进行搜索并返回高亮内容
*/
public Object searchByWords(String word) throws Exception {
List<ArticleSummaryInfoEntity> articles = new ArrayList<ArticleSummaryInfoEntity>();
Pageable pager = new PageRequest(0, 10);
// 构建查询语句
BoolQueryBuilder qb = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("deleted", false))
.must(QueryBuilders.multiMatchQuery(word, "title", "content"));
String preTags = "<span class='highlight'>";
String postTags = "</span>";
// 设置要高亮的字段,高亮的前后标签,高亮内容的截取长度
Field fTitle = new Field("title").preTags(preTags).postTags(postTags).fragmentSize(100);
Field fContent = new Field("content").preTags(preTags).postTags(postTags).fragmentSize(100);
SearchQuery query = new NativeSearchQueryBuilder().withQuery(qb).withPageable(pager)
.withHighlightFields(fTitle, fContent).build();
elasticsearchTemplate.queryForPage(query, ArticleEntity.class, new SearchResultMapper() {
@SuppressWarnings("unchecked")
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
// 总个数
long total = response.getHits().getTotalHits();
// 总页数
int pages = (int) Math.ceil((double) total / pager.getPageSize());
if (response.getHits().getTotalHits() <= 0) {
return null;
}
for (SearchHit searchHit : response.getHits()) {
ArticleSummaryInfoEntity item = new ArticleSummaryInfoEntity();
articles.add(item);
Map<String, Object> source = searchHit.getSource();
item.setArticleId(source.get("articleId").toString());
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
// 查看高亮字段是否命中
HighlightField hlTitleField = highlightFields.get("title");
if (hlTitleField != null && hlTitleField.fragments() != null) {
item.setTitle((hlTitleField.fragments()[0].string()));
} else {
item.setTitle((String) source.get("title"));
}
HighlightField hlContentField = highlightFields.get("content");
if (hlContentField != null && hlContentField.fragments() != null) {
item.setSummary(hlContentField.fragments()[0].string());
} else {
item.setSummary((String) source.get("summary"));
}
}
return new AggregatedPageImpl<T>((List<T>) articles);
}
});
return articles;
}
}
如果使用ngram让部分字段实现完全匹配查询,除了要设置要mappings,java代码中也会有点小改动:给QueryBuilder设置slop和type
......
// 构建查询语句
BoolQueryBuilder qb = QueryBuilders.boolQuery().must(QueryBuilders.multiMatchQuery(search, "content").slop(1).type(Type.PHRASE));
......
【安装】ES的安装过程的更多相关文章
- Linux(centos)安装es(elasticsearch)
前提条件--需要安装jdk环境,不同版本的es所对应的jdk版本要求不同,es6的使用jdk1.8可以 1.下载elasticsearch压缩包 下载地址:https://www.elastic.co ...
- elasticsearch5.0.0 安装插件及配置过程
elasticsearch5.0.0 安装插件及配置过程 由于es5.0是里程碑式的更新,所以很多变化的地方,暂时我就插件安装遇到的问题记录一下. 插件安装命令 2.3版本的安装命令 安装Marvel ...
- 2016最新cocoapods安装流程,安装过程中遇到的问题及解决方法
现在的cocoapods与之前比较.有很多不一样的地方.自己试了一试,终于搞定.现在大概纪录一下. 1.首先查看ruby是否是最新版的. ruby是通过rvm安装的所以需要先安装rvm后查看ruby是 ...
- cocoapods安装以及使用,安装过程中ruby版本过低
cocoapods安装以及使用,安装过程中ruby版本过低 字数473 阅读103 评论1 喜欢2 1.打开终端 2.移除现有 Ruby 默认源 $ gem sources --remove http ...
- Deepin下phpunit安装,以及执行过程中所遇到的问题
Deepin下phpunit安装,以及执行过程中所遇到的问题 安装phpunit步骤 wget https://phar.phpunit.de/phpunit.phar chmod +x phpuni ...
- CentOS 5.5 下安装Countly Web Server过程记录
CentOS 5.5 下安装Countly Web Server过程记录 1. 系统更新与中文语言包安装 2. 基本环境配置: 2.1. NodeJS安装 依赖项安装 yum -y install g ...
- linux-i386(ubuntu)下编译安装gsoap_2.8.17过程记录
过程记录 : 1.下载gsoap_2.8.17.zip 并 解压 : $unzip gsoap_2.8.17.zip 2.进入解压后的目录gsoap-2.8 3.自动配置编译环境: $ ...
- 安装Debian 7.8 过程,以及该系统的配置过程
最近,我给自己的电脑安装了Debian操作系统,版本7.8 stable.Debian我相信大家都能了解,它是Ubuntu的基础,Ubuntu是基于Debian的unstable开发的.我安装这个系统 ...
- linux安装apache软件的过程
参考官方安装指导:http://httpd.apache.org/docs/2.4/install.html 1.下载依赖包 apr/apr-util/pcre 2.解压依赖包 3.安装apr 进入安 ...
随机推荐
- nginx代理学习
一.windows下nginx代理ftp服务器 我所在的开发环境里,nginx和ftp在同一台服务器. ftp根目录: nginx的配置: 在nginx.conf中加入: server { liste ...
- python epoll实现异步socket
一.同步和异步: 在程序执行中,同步运行意味着等待调用的函数.线程.子进程等的返回结果后继续处理:异步指不等待当下的返回结果,直接运行主进程下面的程序,等到有返回结果时,通知主进程处理.有点高效. 二 ...
- 170804、使用Joda-Time优雅的处理日期时间
简介 在Java中处理日期和时间是很常见的需求,基础的工具类就是我们熟悉的Date和Calendar,然而这些工具类的api使用并不是很方便和强大,于是就诞生了Joda-Time这个专门处理日期时间的 ...
- Gitlab安装和使用
GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. GitLab拥有与Github类似 ...
- rac数据库单连接报错ora-12537解决办法
1.现象如下: C:\Users\Administrator.DBA-PC>sqlplus sys/oracle@192.168.100.33:1521/orcl as sys dba SQL* ...
- webrtc--stun-turn
.WebRTC后台服务: 通话的房间服务器(Room Server) 房间服务器是用来创建和管理通话会话的状态维护,是双方通话还是多方通话,加入与离开房间等等,我们暂时沿用Google部署在GAE平台 ...
- Andrew Ng机器学习公开课笔记 -- 朴素贝叶斯算法
网易公开课,第5,6课 notes,http://cs229.stanford.edu/notes/cs229-notes2.pdf 前面讨论了高斯判别分析,是一种生成学习算法,其中x是连续值 这里要 ...
- Just a Hook---hdu1698(线段树---区间处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 现有n个金属(编号1---n),每个金属的材质都是铜,有m个操作,每个操作都是把编号 L 到 R ...
- docker 离线环境安装oracle
因测试需要,需在内网的测试环境搭建一套docker Oracle 11g环境进行测试,测试环境为redhat 6.6 安装docker 1.7,本机windows 7 环境,安装docker 17.1 ...
- OC最基础的系统转场动画
SystemAnimationViewController *system = [SystemAnimationViewController new]; CATransition *animation ...