es入门资料Word文件下载.docx
- 文档编号:19077771
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:20
- 大小:527.30KB
es入门资料Word文件下载.docx
《es入门资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《es入门资料Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
7.
代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
8.Transport
代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。
分布式搜索elasticsearch配置文件详解
elasticsearch的config文件夹里面有两个配置文件:
和,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,所以里的设置按普通log4j配置文件来设置就行了。
下面主要讲解下这个文件中可配置的东西。
1.:
elasticsearch
配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
2.:
"
FranzKafka"
节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里文件中,其中有很多作者添加的有趣名字。
3.:
true
指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
4.:
指定该节点是否存储索引数据,默认为true。
5.:
5
设置默认索引分片个数,默认为5片。
6.:
1
设置默认索引副本个数,默认为1个副本。
elasticsearchjavaAPI之
(一)---与集群交互
可以通过两种方式来连接到elasticsearch(简称es)集群,第一种是通过在你的程序中创建一个嵌入es节点(Node),使之成为es集群的一部分,然后通过这个节点来与es集群通信。
第二种方式是用TransportClient这个接口和es集群通信。
1.Node方式
创建嵌入节点的方式如下:
importstatic
ode();
Clientclient=();
ddTransportAddress(newInetSocketTransportAddress("
"
9300))
.addTransportAddress(newInetSocketTransportAddress("
9300));
();
es的一些配置也可通过javaAPI进行设置,如:
Settingssettings=()
.put("
"
myclustername"
).build();
Clientclient=newTransportClient(settings);
elasticsearchjavaAPI之
(二)---putMapping定义索引字段属性
Mapping,就是对索引库中索引的字段名及其数据类型进行定义,类似于关系数据库中表建立时要定义字段名及其数据类型那样,不过es的mapping比数据库灵活很多,它可以动态添加字段。
一般不需要要指定mapping都可以,因为es会自动根据数据格式定义它的类型,如果你需要对某些字段添加特殊属性(如:
定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。
有两种添加mapping的方法,一种是定义在配置文件中,一种是运行时手动提交mapping,两种选一种就行了。
1.配置文件中定义mapping
你可以把[mapping名].json文件放到config/mappings/[索引名]目录下,这个目录要自己创建,一个mapping和一个索引对应,你也可以定义一个默认的mapping,把自己定义的放到config目录下就行。
json格式如下:
{
mappings"
:
properties"
title"
type"
string"
store"
yes"
},
description"
index"
not_analyzed"
price"
double"
onSale"
boolean"
integer"
createDate"
date"
}
}
2.通过请求添加mapping
下面为一个添加productIndex索引库的mapping的json格式请求。
其中productIndex为索引类型,properties下面的为索引里面的字段,type为数据类型,store为是否存储,"
为不对该字段进行分词。
myindex"
另外es也提供了javaAPI来创建索引,首先创建一个空的索引库,类似于关系数据库先创建一个空表。
().indices().prepareCreate("
myindex"
).execute().actionGet();
之后,再通过代码设置索引的字段Mapping,类似于定义数据库表的字段属性。
XContentBuildermapping=)
.startObject()
.startObject("
)
)
).field("
).endObject()
).endObject()
.endObject()
.endObject();
PutMappingRequestmappingRequest=("
).type("
myindextype"
).source(mapping);
().indices().putMapping(mappingRequest).actionGet();
至此,我们已经在集群中成功创建了一个名为myindex的索引库。
elasticsearchjavaAPI之(三)---索引数据
创建出了索引库,下来我们就需要将数据入到索引库中,以便我们之后对其数据进行搜索使用。
es索引数据非常方便,只需构建个json格式的数据提交到es就行,下面是个javaapi的例子:
XContentBuilderdoc=)
.startObject()
.field("
thisisatitle!
descriptwhat"
100)
true)
1)
newDate())
("
"
myindextype"
).setSource(doc).setId(id).execute().actionGet();
其中myindex为索引库名,一个es集群中可以有多个索引库。
myindextype为索引类型,是用来区分同索引库下不同类型的数据的,一个索引库下可以有多个索引类型。
除此种插入数据的类型外,还可以在mapreduce中,读取hbase的数据直接格式化索引至es中。
数据插入成功后,我们可以通过getAPI来检索一条数据。
我们根据index、type和id,Get一条记录的方法很简单:
GetResponsegetResponse=("
id).execute().actionGet();
elasticsearchjavaAPI之(四)---删除索引数据
删除api允许从特定索引通过id删除json文档。
有两种方法,一是通过id删除,二是通过一个Query查询条件删除,符合这些条件的数据都会被删除。
1.通过id删除
下面的例子是删除索引名为myindex,类型为myindextype,id为1的文档:
DeleteResponseresponse=("
1"
).execute().actionGet();
2.通过Query删除
下面的例子是删除索引名为myindex,title中包含query的所有文档:
QueryBuilderquery=("
query"
);
("
).setQuery(query).execute().actionGet();
elasticsearchjavaAPI之(五)---搜索1
elasticsearch的查询是通过执行json格式的查询条件,在javaapi中就是构造QueryBuilder对象,elasticsearch完全支持queryDSL风格的查询方式,QueryBuilder的构建类是QueryBuilders,filter的构建类是FilterBuilders。
下面是构造QueryBuilder的例子:
importstatic
QueryBuilderqb1=termQuery("
name"
kimchy"
QueryBuilderqb2=boolQuery()
.must(termQuery("
content"
test1"
))
test4"
.mustNot(termQuery("
test2"
.should(termQuery("
test3"
));
QueryBuilderqb3=filteredQuery(
termQuery("
shay"
),
rangeFilter("
age"
.from(23)
.to(54)
.includeLower(true)
.includeUpper(false)
);
其中qb1构造了一个TermQuery,对name这个字段进行项搜索,项是最小的索引片段,这个查询对应lucene本身的TermQuery。
qb2构造了一个组合查询(BoolQuery),其对应lucene本身的BooleanQuery,可以通过must、should、mustNot方法对QueryBuilder进行组合,形成多条件查询。
qb3构造了一个过滤查询,就是在TermQuery的基础上添加一个过滤条件RangeFilter,这个范围过滤器将限制查询age字段大于等于23,小于等于54的结果。
构造好了Query就要传到elasticsearch里面进行查询,下面是例子:
SearchResponseresponse=("
.setQuery(qb1)
.setFrom(0).setSize(60).setExplain(true)
.execute()
.actionGet();
上边代码的意思是:
查询myindex索引,查询条件为query(创建的查询对象,如同上边的qb1,qb2),从第0条记录开始,最多返回60条记录。
返回结果为SearchResponse,下面解析SearchResponse:
SearchHitshits=();
for(inti=0;
i<
60;
i++){
"
field"
}
获得SearchResponse中的SearchHits,然后(i).getSource().get("
)获得field字段的值。
elasticsearchjavaAPI之(六)---批量添加删除索引
elasticsearch支持批量添加或删除索引文档,javaapi里面就是通过构造BulkRequestBuilder,然后把批量的index/delete请求添加到BulkRequestBuilder里面,执行BulkRequestBuilder。
下面是个例子:
BulkRequestBuilderbulkRequest=();
IndexRequestrequest1=("
.setSource()
.startObject()
.field("
user"
postDate"
message"
tryingoutElasticSearch"
.endObject()
).request();
(request1);
IndexRequestrequest2=("
2"
anotherpost"
).request();
(request2);
BulkResponsebulkResponse=().actionGet();
if()){
rom(20).to(22);
SearchResponseresponse=client
.prepareSearch("
.setTypes("
myindextype"
myindextype1"
myindextype2"
myindextype3"
myindextype4"
.setSearchType
.setQuery(builder)etFilter(filter)etFrom(0).setSize(60).setExplain(true).execute().actionGet();
SearchHitshits=();
for(SearchHithit:
hits){
Stringjson=();
…
}
setSearchType(SearchTypesearchType):
执行检索的类别,值为的元素,SearchType是一个枚举类型的类,其值如下所示:
QUERY_THEN_FETCH
查询是针对所有的块执行的,但返回的是足够的信息,而不是文档内容(Document)。
结果会被排序和分级,基于此,只有相关的块的文档对象会被返回。
由于被取到的仅仅是这些,故而返回的hit的大小正好等于指定的size。
这对于有许多块的index来说是很便利的(返回结果不会有重复的,因为块被分组了)。
QUERY_AND_FETCH
最原始(也可能是最快的)实现就是简单的在所有相关的shard上执行检索并返回结果。
每个shard返回一定尺寸的结果。
由于每个shard已经返回了一定尺寸的hit,这种类型实际上是返回多个shard的一定尺寸的结果给调用者。
DFS_QUERY_THEN_FETCH
与QUERY_THEN_FETCH相同,预期一个初始的散射相伴用来为更准确的score计算分配了的term频率。
DFS_QUERY_AND_FETCH
与QUERY_AND_FETCH相同,预期一个初始的散射相伴用来为更准确的score计算分配了的term频率。
SCAN
在执行了没有进行任何排序的检索时执行浏览。
此时将会自动的开始滚动结果集。
COUNT
只计算结果的数量,也会执行facet。
setQuery,设置查询使用的Query;
setFilter,设置过滤器;
setExplain,设置是否按查询匹配度排序;
setFrom,从哪一个Score开始查;
setSize,需要查询出多少条结果;
检索出结果后,通过response..getHits()可以得到所有的SearchHit,得到Hit后,便可迭代Hit取到对应的Document.
1.
总的来说,matchQuery能够使用某一field的值对Document进行查询。
@Test
publicvoidmatchQuery(){
try{
Stringname="
;
Stringtext="
james"
etTypes(myindextype).setQuery(qb).setFrom(0).setSize(12)
.execute().actionGet();
SearchHitshits=();
}catch(Exceptione){
();
2.
termQuery,经总结发现,termQuery中的value有以下情况:
1.若value为汉字,则大部分情况下,只能为一个汉字,或者一个词;
2.若value为英文,可以为一个字母,会对字段中包含此字母的值进行搜索;
termQuery代码如下所示:
…
QueryBuilderqb=("
别"
SearchResponsesResponse=(myindex)
.setTypes(myindextype).setQuery(qb).setFrom(0).setSize(12)
.execute().actionGet();
3.
相对于matchQuery,multiMatchQuery针对的是多个field,也就是说,当multiMatchQuery中,fieldNames参数只有一个时,其作用与matchQuery相当;
而当fieldNames有多个参数时,如field1和field2,那查询的结果中,要么field1中包含text,要么field2中包含text。
示例代码如下所示:
Stringtext="
ultiMatchQuery(text,"
sex"
SearchResponsesResponse=(myindex)
4.
短语的形式查询
etIndex(myindex)
.setType(myindextype).setId()).setSource(source)
.request();
(request);
BulkR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- es 入门 资料