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的安装过程的更多相关文章

  1. Linux(centos)安装es(elasticsearch)

    前提条件--需要安装jdk环境,不同版本的es所对应的jdk版本要求不同,es6的使用jdk1.8可以 1.下载elasticsearch压缩包 下载地址:https://www.elastic.co ...

  2. elasticsearch5.0.0 安装插件及配置过程

    elasticsearch5.0.0 安装插件及配置过程 由于es5.0是里程碑式的更新,所以很多变化的地方,暂时我就插件安装遇到的问题记录一下. 插件安装命令 2.3版本的安装命令 安装Marvel ...

  3. 2016最新cocoapods安装流程,安装过程中遇到的问题及解决方法

    现在的cocoapods与之前比较.有很多不一样的地方.自己试了一试,终于搞定.现在大概纪录一下. 1.首先查看ruby是否是最新版的. ruby是通过rvm安装的所以需要先安装rvm后查看ruby是 ...

  4. cocoapods安装以及使用,安装过程中ruby版本过低

    cocoapods安装以及使用,安装过程中ruby版本过低 字数473 阅读103 评论1 喜欢2 1.打开终端 2.移除现有 Ruby 默认源 $ gem sources --remove http ...

  5. Deepin下phpunit安装,以及执行过程中所遇到的问题

    Deepin下phpunit安装,以及执行过程中所遇到的问题 安装phpunit步骤 wget https://phar.phpunit.de/phpunit.phar chmod +x phpuni ...

  6. CentOS 5.5 下安装Countly Web Server过程记录

    CentOS 5.5 下安装Countly Web Server过程记录 1. 系统更新与中文语言包安装 2. 基本环境配置: 2.1. NodeJS安装 依赖项安装 yum -y install g ...

  7. linux-i386(ubuntu)下编译安装gsoap_2.8.17过程记录

    过程记录 :  1.下载gsoap_2.8.17.zip 并 解压 : $unzip gsoap_2.8.17.zip     2.进入解压后的目录gsoap-2.8   3.自动配置编译环境:  $ ...

  8. 安装Debian 7.8 过程,以及该系统的配置过程

    最近,我给自己的电脑安装了Debian操作系统,版本7.8 stable.Debian我相信大家都能了解,它是Ubuntu的基础,Ubuntu是基于Debian的unstable开发的.我安装这个系统 ...

  9. linux安装apache软件的过程

    参考官方安装指导:http://httpd.apache.org/docs/2.4/install.html 1.下载依赖包 apr/apr-util/pcre 2.解压依赖包 3.安装apr 进入安 ...

随机推荐

  1. session.setAttribute和session.getAttribute

    网上搜了些资料 ----------------------------------------------------------------------------- B/S架构中,客户端与服务器 ...

  2. sencha touch 组件选择器getCmp和ComponentQuery.query()的效率解析

    昨天无意中在网上看到一篇讲解sencha touch组件选择器的文章,名为 Sencha touch 2通过Ext.ComponentQuery.query查找组件. 里面对组件选择器的效率讲解完全反 ...

  3. web.xml的contextConfigLocation作用及自动加载applicationContext.xml

    web.xml的contextConfigLocation作用及自动加载applicationContext.xml 转自:http://blog.csdn.net/sapphire_aling/ar ...

  4. web站点检查简易shell脚本

    1.web样式 <h4>THE STATUS OF RS:</h4> <meta http-equiv="> <table border=" ...

  5. 修改bootstrap 的全局样式,bootstrap 3.0 是由html5和CSS 3组成的

    方法一: 不建议使用 * {}选择器,因为在一些其他样式插件.特殊部分会有更好的字体样式设定,用*就会全部覆盖. 正常引入bootstrap的css样式后,记得将自定义的样式表放到其之后, <l ...

  6. MVC之路由

    1.路由规则理解: 在MVC项目中,路由是一个独立的模块,需要引入System.Web.Routing ,路由的作用就是确定控制器和行为,同时确定其他的参数,然后将这些信息传递个相应的控制器和行为. ...

  7. PL/SQL编程基础(四):程序控制(IF,CASE,FOR,LOOP,WHILE LOOP,EXIT,CONTINUE)

    程序控制 程序结构有分支结构与循环结构: 分支结构语法:IF.CASE: 循环结构:FOR.WHILE LOOP:先执行再判断,至少执行一次: WHILE LOOP:先判断再执行,如果不满足条件,就不 ...

  8. Java使用极小的内存完成对超大数据的去重计数,用于实时计算中统计UV

    Java使用极小的内存完成对超大数据的去重计数,用于实时计算中统计UV – lxw的大数据田地 http://lxw1234.com/archives/2015/09/516.htm Java使用极小 ...

  9. 苹果推送通知服务APNs编程(转)

    add by zhj: 下面的几篇文章也非常好, http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios- ...

  10. 7.如何将python脚本打包为exe形式

    先安装pyinstaller,pip install pyinstaller 然后 pyinstaller -F combine.py打包即可