Elastisearch是一个很强大,易用的搜索引擎
在系统上运行Elastisearch只需以下几步
1.下载Elastisearch
复制代码 代码如下:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.0.zip
2.解压
1
|
unzip elasticsearch-5.4.0.zip
|
3.运行
1
|
elasticsearch-5.4.0/bin/elasticsearch
|
这时有可能会直接被Killed掉,因为内存溢出(OOM),elastisearch占用的内存非常大,所以在内存比较小的服务器上运行要先修改jvm的内存大小
1
|
vi elasticsearch-5.4.0 /config/jvm .options
|
将22和23行的栈堆大小改为512M
1
2
|
-Xms512M
-Xmx512M
|
如果重新启动后还是killed就再改小一点
4.测试是否成功
1
|
curl 'http://localhost:9200/?pretty'
|
你能看到以下返回信息:
1
2
3
4
5
6
7
8
9
|
{
"status" : 200,
"name" : "Shrunken Bones" ,
"version" : {
"number" : "1.4.0" ,
"lucene_version" : "4.10"
},
"tagline" : "You Know, for Search"
}
|
则表明启动成功
接下来我们用Java的API来操作Elasticsearch
首先是导入elastisearch和log4j的包
POM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<? xml version = "1.0" encoding = "UTF-8" ?>
< project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
< modelVersion >4.0.0</ modelVersion >
< groupId >com.jk</ groupId >
< artifactId >ElasticsearchExample</ artifactId >
< version >1.0-SNAPSHOT</ version >
< dependencies >
< dependency >
< groupId >org.elasticsearch.client</ groupId >
< artifactId >transport</ artifactId >
<!--用哪个版本就填什么-->
< version >5.4.0</ version >
</ dependency >
< dependency >
< groupId >org.apache.logging.log4j</ groupId >
< artifactId >log4j-api</ artifactId >
< version >2.7</ version >
</ dependency >
</ dependencies >
</ project >
|
以下是常用的几种操作
1.创建client
1
2
3
4
5
6
7
|
Client client = null ;
try {
client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName( "localhost" ), 9300 ));
} catch (Exception e) {
e.printStackTrace();
}
|
2.创建索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/**
* 创建索引,有则先删除
* @param client
*/
private static void recreateIndex(Client client) {
if (client.admin().indices().prepareExists(index).execute().actionGet()
.isExists()) {
DeleteIndexResponse deleteIndexResponse = client.admin().indices()
.delete( new DeleteIndexRequest(index)).actionGet();
System.out.println( "delete index :" );
System.out.println(deleteIndexResponse);
}
CreateIndexResponse createIndexResponse = client.admin().indices()
.prepareCreate(index).execute().actionGet();
System.out.println( "create index :" );
System.out.println(createIndexResponse);
}
|
3.插入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
/**
* 插入数据
* @param client
*/
@SuppressWarnings ({ "rawtypes" , "unchecked" })
private static void doIndex( final Client client) {
Map s11 = new LinkedHashMap();
s11.put( "title" , "Think in java" );
s11.put( "origin" , "美国" );
s11.put( "description" , "初级java开发人员必读的书" );
s11.put( "author" , "Bruce Eckel" );
s11.put( "price" , 108 );
Map s12 = new LinkedHashMap();
s12.put( "title" , "Head First Java" );
s12.put( "origin" , "英国" );
s12.put( "description" , "java入门教材" );
s12.put( "author" , "Kathy Sierra" );
s12.put( "price" , 54 );
Map s21 = new LinkedHashMap();
s21.put( "title" , "Design Pattern" );
s21.put( "origin" , "法国" );
s21.put( "description" , "程序员不得不读的设计模式" );
s21.put( "author" , "Kathy Sierra" );
s21.put( "price" , 89 );
Map s22 = new LinkedHashMap();
s22.put( "title" , "黑客与画家" );
s22.put( "origin" , "法国" );
s22.put( "description" , "读完之后脑洞大开" );
s22.put( "author" , "Paul Graham" );
s22.put( "price" , 35 );
BulkResponse bulkResponse = client
.prepareBulk()
.add(client.prepareIndex(index, type).setId( "11" ).setSource(s11).setOpType(IndexRequest.OpType.INDEX).request())
.add(client.prepareIndex(index, type).setId( "12" ).setSource(s12).setOpType(IndexRequest.OpType.INDEX).request())
.add(client.prepareIndex(index, type).setId( "21" ).setSource(s21).setOpType(IndexRequest.OpType.INDEX).request())
.add(client.prepareIndex(index, type).setId( "22" ).setSource(s22).setOpType(IndexRequest.OpType.INDEX).request())
.execute().actionGet();
if (bulkResponse.hasFailures()) {
System.err.println( "index docs ERROR:" + bulkResponse.buildFailureMessage());
} else {
System.out.println( "index docs SUCCESS:" );
System.out.println(bulkResponse);
}
}
|
4.查询所有
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**
* 查询所有
*/
private static void searchAll(Client client) {
SearchResponse response = client.prepareSearch(index)
.setQuery(QueryBuilders.matchAllQuery())
.setExplain( true ).execute().actionGet();
System.out.println( "searchAll : " );
for (SearchHit searchHit : response.getHits()) {
System.out.println( "********" );
System.out.println(searchHit.getSource());
}
}
|
5.关键词查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**
* 关键词查询
*
* @param client
*/
private static void searchKeyWord(Client client) {
SearchResponse response = client.prepareSearch(index)
//查询所有字段匹配关键字
.setQuery(QueryBuilders.matchQuery( "_all" , "法国" ))
//设置最小匹配程度
// .setQuery(QueryBuilders.matchQuery("_all", "法国").minimumShouldMatch("100%"))
.execute().actionGet();
System.out.println( "searchKeyWord : " );
System.out.println(response);
}
|
6.数值范围过滤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/**
* 数值范围过滤
*
* @param client
*/
private static void searchRange(Client client) {
SearchResponse response = client.prepareSearch(index).
//大于80,小于100
setQuery(QueryBuilders.rangeQuery( "price" ).gt( 80 ).lt( 100 ))
.execute()
.actionGet();
System.out.println( "searchRange : " );
System.out.println(response);
}
|
7.排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/**
* 排序
*
* @param client
*/
private static void searchOrdered(Client client) {
SearchResponse response = client.prepareSearch(index)
.setQuery(QueryBuilders.matchAllQuery())
//根据价格降序排序
.addSort(SortBuilders.fieldSort( "price" )
.order(SortOrder.DESC)).execute().actionGet();
System.out.println( "searchOrdered : " );
System.out.println(response);
}
|
8.高亮关键字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/**
* 高亮关键字
* @param client
*/
private static void searchHightlight(Client client) {
//高亮多个字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field( "title" );
highlightBuilder.field( "description" );
SearchResponse response = client.prepareSearch(index)
//单条件匹配,高亮时只能高亮该字段
// .setQuery(QueryBuilders.matchQuery("title", "java"))
//多条件匹配,高亮时只能高亮多个字段
.setQuery(QueryBuilders.multiMatchQuery( "开发人员必读" , "title" , "description" ))
.highlighter(highlightBuilder)
.execute()
.actionGet();
System.out.println( "searchHightlight : " );
System.out.println(response);
}
|
9.根据id查找
1
2
3
4
5
6
7
8
9
10
|
/**
* 根据id查找
* @param client
*/
private static void findById( final Client client) {
String id= "12" ;
GetResponse response = client.prepareGet(index, type, id).get();
System.out.println( "findById" );
System.out.println(response);
}
|
10.删除
1
2
3
4
5
6
7
8
|
/**
* 删除
* @param client
*/
private static void deleteById(Client client) {
String id= "12" ;
DeleteResponse response = client.prepareDelete(index, type, id).get();
}
|
11.更新
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**
* 更新
* @param client
*/
private static void updateById(Client client) {
try {
String id= "11" ;
client.prepareUpdate(index, type, id)
.setDoc(jsonBuilder()
.startObject()
.field( "title" , "白鹿原" )
.endObject())
.get();
} catch (IOException e) {
e.printStackTrace();
}
}
|
常用的操作就这些,代码上传到https://github.com/jkgeekJack/ElasticsearchExample
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.jianshu.com/p/46c38f352c27