2.Solr 利用 Zookeeper 進行分佈式管理,而 Elasticsearch 自身帶有分佈式協調管理功能。html
3.Solr 支持更多格式的數據,好比JSON、XML、CSV,而 Elasticsearch 僅支持json文件格式。java
4.Solr 官方提供的功能更多,而 Elasticsearch 自己更注重於核心功能,高級功能多有第三方插件提供node
5.Solr 在傳統的搜索應用中表現好於 Elasticsearch,但在處理實時搜索應用時效率明顯低於 Elasticsearch。數據庫
6.Solr 是傳統搜索應用的有力解決方案,但 Elasticsearch 更適用於新興的實時搜索應用。編程
7.Solr專一於文本搜索,而Elasticsearch則經常使用於查詢、過濾和分組分析統計
2.Elastic 的底層是開源庫 Lucene,須要java8環境,默認9200端口json
Search:從replSet中選定node(負載策略)->請求分發 ->結果集合並api
@Before1.依賴的包
public void createConn() throws Exception {
System.out.printf("---create----------");
Settings settings = Settings.settingsBuilder().put("cluster.name", "lzxcluster").build();
client = TransportClient.builder().settings(settings).build().
addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node01"), 9300)).
addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node02"), 9300)).
addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node03"), 9300));
}
@After
public void closeConn() {
System.out.printf("---close----------");
client.close();
}
@Test
public void createIndex() {
System.out.printf("---create--index--------");
//檢查是否已有索引庫存在
IndicesExistsResponse indicesExistsResponse = client.admin().indices().prepareExists("lzxtest").execute().actionGet();
if (indicesExistsResponse.isExists()) {
client.admin().indices().prepareDelete("lzxtest").execute();
}
Map<String, Object> sets = new HashMap<>();
//設置副本數2
sets.put("number_of_replicas", 2);
client.admin().indices().prepareCreate("lzxtest").setSettings(sets).execute();
}
@Test
public void addData(){
Map<String,Object> dataMap=new HashMap<>();
dataMap.put("name","aaa");
dataMap.put("content","wqlwx is a bad manz");
dataMap.put("size",28);
//prepareIndex(索引庫,類型)
IndexResponse indexResponse=client.prepareIndex("lzxtest","testfields")
.setSource(dataMap)
.execute().actionGet();
System.out.println("id:"+indexResponse.getId());
}
@Test
public void queryData(){
QueryBuilder queryBuilder=new MatchQueryBuilder("content","lzx");
SearchResponse searchResponse=client.prepareSearch("lzxtest")
.setTypes("testfields")
.setQuery(queryBuilder)
.execute()
.actionGet();
SearchHits searchHits= searchResponse.getHits();
System.out.println("總共內容命中次數"+searchHits.getTotalHits());
for (SearchHit searchHit:searchHits){
System.out.println("單個所有內容:"+searchHit.getSourceAsString());
System.out.println("內容:"+searchHit.getSource().get("content"));
}
}
@Test
public void queryDataByPage(){
QueryBuilder queryBuilder=new MatchQueryBuilder("content","lzx");
SearchResponse searchResponse=client.prepareSearch("lzxtest")
.setTypes("testfields")
.addHighlightedField("content") //高亮
.setHighlighterPreTags("<font color=red>")
.setHighlighterPostTags("</font>")
.setQuery(queryBuilder)
.setFrom(0) //起始點
.setSize(2) //查兩個
.execute()
.actionGet();
SearchHits searchHits= searchResponse.getHits();
System.out.println("總共內容命中次數"+searchHits.getTotalHits());
for (SearchHit searchHit:searchHits){
System.out.println("單個所有內容:"+searchHit.getSourceAsString());
System.out.println("內容:"+searchHit.getSource().get("content"));
System.out.println("高亮內容:"+searchHit.getHighlightFields().get("content").getFragments()[0]);
}
}
<dependency>1.Java客戶端鏈接Elasticsearch: 客戶端版本應和服務端版本一致
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-analysis-ik</artifactId>
<version>5.5.1</version>
</dependency>
/**
* cluster.name:設置ES實例的名稱
* client.transport.sniff:自動嗅探整個集羣的狀態,把集羣中其餘ES節點的ip添加到本地的客戶端列表中
* PreBuiltTransportClient:初始化client較老版本發生了變化,此方法有幾個重載方法,初始化插件等。
* */
Settings esSettings = Settings.builder()
.put("cluster.name", clusterName)
.put("client.transport.sniff", true)
.build();
client = new PreBuiltTransportClient(esSettings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), esPort));
/**
* 若是 ElasticSearch 服務安裝了 x-pack 插件,須要 PreBuiltXPackTransportClient 實例才能訪問
* */
Settings settings = Settings.builder().put("cluster.name", "xxx")
.put("xpack.security.transport.ssl.enabled", false)
.put("xpack.security.user", "xxx:xxx")
.put("client.transport.sniff", true).build();
try {
client = new PreBuiltXPackTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("xxx.xxx.xxx.xxx"), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("xxx.xxx.xxx.xxx"), 9300));
} catch (UnknownHostException e) {
e.printStackTrace();
}
CsdnBlog csdn=new CsdnBlog();
csdn.setTag("C");
csdn.setView("100");
csdn.setTitile("編程");
csdn.setDate(new Date().toString());
ObjectMapper mapper = new ObjectMapper();
byte[] json = mapper.writeValueAsBytes(csdn);
IndexResponse response = client.prepareIndex("fendo", "fendodate").setSource(json).get();
XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
.field("user", "ccse")
.field("postDate", new Date())
.field("message", "this is Elasticsearch").endObject();
IndexResponse response = client.prepareIndex("fendo", "fendodata").setSource(builder).get();
BulkByScrollResponse response =異步方式:
DeleteByQueryAction.INSTANCE.newRequestBuilder(client).filter(QueryBuilders.matchQuery("gender", "male"))//查詢條件
.source("persons") //index(索引名)
.get(); //執行
long deleted = response.getDeleted(); //刪除文檔的數量
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)Upsert:更新插入
.filter(QueryBuilders.matchQuery("gender", "male")) //查詢
.source("persons") //index(索引名)
.execute(new ActionListener<BulkByScrollResponse>() { //回調監聽
@Override
public void onResponse(BulkByScrollResponse response) {
long deleted = response.getDeleted(); //刪除文檔的數量
}
@Override
public void onFailure(Exception e) {
}
});
IndexRequest indexRequest = new IndexRequest("index", "type", "1").source(jsonBuilder()多值獲取:一次獲取多個文檔
.startObject()
.field("name", "Joe Smith")
.field("gender", "male")
.endObject());
UpdateRequest updateRequest = new UpdateRequest("index", "type", "1").doc(jsonBuilder()
.startObject()
.field("gender", "male")
.endObject())
.upsert(indexRequest); //若是不存在此文檔 ,就增長 `indexRequest`
client.update(updateRequest).get();
MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
.add("twitter", "tweet", "1") //一個id的方式
.add("twitter", "tweet", "2", "3", "4") //多個id的方式
.add("another", "type", "foo") //能夠從另一個索引獲取
.get();
for (MultiGetItemResponse itemResponse : multiGetItemResponses) { //迭代返回值
GetResponse response = itemResponse.getResponse();
if (response.isExists()) { //判斷是否存在
String json = response.getSourceAsString(); //_source 字段
}
}