이 글에서는 주로 봄에 Elasticsearch를 사용하는 자세한 코드 구현을 소개합니다. 관심 있는 분들은 참고해 보세요.
Elasticsearch를 사용하기 전에 몇 가지 건조한 정보에 대해 말씀드리겠습니다.
1. ES와 Solr 모두 전체 텍스트 검색 엔진으로 나타납니다. 둘 다 Lucene 기반 검색 서버입니다.
2. ES는 데이터베이스가 아닌 안정적인 스토리지 시스템이 아니며 데이터 손실 위험이 있습니다.
3. ES는 실시간 시스템이 아닙니다. 데이터 쓰기의 성공은 단지 트랜스 로그의 성공입니다(MySQL의 bin 로그와 유사). 작성하면 바로 쿼리찾을 수 없는 것이 정상입니다. 데이터가 스토리지 엔진에 들어가지 않고 현재 메모리에 남아 있을 수 있기 때문입니다. 마찬가지로, 데이터를 삭제한 후에도 즉시 사라지지는 않습니다. 쓰기는 언제 쿼리할 수 있나요? ES 내부에는 정기적으로 메모리의 데이터 배치를 스토리지 엔진에 쓰는 백그라운드 스레드가 있으며, 그 이후에 데이터가 표시됩니다. 기본적으로 백그라운드 스레드는 초당 한 번 실행됩니다. 이 스레드가 더 자주 실행될수록 쓰기 성능이 저하됩니다. 실행 빈도가 낮을수록 쓰기 성능이 높아집니다(무한히 높지는 않음).
4. 현재 알려진 단일 ES 클러스터는 PB급 데이터를 저장할 수 있지만 이는 매우 번거롭다. 테라바이트 수준의 데이터에 대한 부담은 없습니다.
5. ES에서 공식적으로 제공하는 jar 패키지를 사용하여 접근하려면 JDK1.7 이상이 필요합니다.
6. 해당 버전을 사용하여 ES 서버에 접속하세요. ES 서버 버전이 1.7인 경우 ES 1.7 클라이언트를 사용하세요. ES 서버가 2.1인 경우 2.1 클라이언트를 사용하세요.
7. Linux 서버의 파일 시스템에 ES 인덱스가 존재합니다. (뒤에는 HDFS와 유사한 분산 파일 시스템이 아닌 파일 시스템이 있습니다.)
ES Java 클라이언트는 스레드로부터 안전합니다. 전역적으로 빌드하면 읽기 및 쓰기 요구 사항을 충족할 수 있습니다. 매번 ES 클라이언트를 만들지 마세요. ES에 액세스할 때마다 새로운 es 클라이언트를 구축하면 예외가 발생합니다.
9. ES의 동적 식별 및 생성 메커니즘은 많은 경우에 필요하지 않기 때문에 사용하지 않는 것이 좋습니다. 권장되는 접근 방식은 데이터를 쓰기 전에 매핑을 신중하게 생성하는 것입니다.
10. ES에서는 딥 페이징을 사용하지 않는 것이 좋습니다. 이로 인해 클러스터를 사용할 수 없게 될 수 있습니다.
11. ES는 인덱스를 생성할 때 샤드 수가 결정되면 나중에 수정할 수 없습니다.
12. ES에서는 Type이 제공됩니다. 많은 사람들은 Type이 물리적인 테이블이고, Type의 데이터가 독립적으로 저장된다고 생각하지만, ES 내부에서는 그렇지 않습니다. ES 내부의 필드입니다. 따라서 많은 양의 데이터를 독립적인 인덱스로 나눌 수 있는 경우에는 하나의 인덱스에 넣지 말고 타입을 이용하여 나누는 것이 좋다. 중첩 클래스 및 부모-자식 클래스의 경우에만 유형을 사용하는 것이 합리적입니다.
13. ES는 네이티브 중국어 단어 분할 기능을 제공하지 않습니다. ik 등과 같은 타사 중국어 단어 분할 플러그인이 있습니다. Ik는 장난감 단어 분할기입니다. 심각한 단어 분할이 필요한 경우 독립된 단어 분할기를 사용하여 ES를 사용하기 전에 단어를 분할하고 ES에 쓰십시오.
14. ES의 인덱스는 먼저 샤딩됩니다. 샤딩된 각 데이터는 일반적으로 자체 데이터 복사본을 갖습니다. ES의 샤드 할당 전략은 동일한 샤딩된 데이터를 보장합니다. . 복제본은 동일한 노드에 할당되지 않습니다. 클러스터의 노드가 다운되면 ES 마스터는 특정 전략을 통해 노드를 ping할 때 해당 노드가 살아 있지 않다는 것을 알게 됩니다. ES 복구 프로세스가 시작됩니다.
ES는 그렇지 않습니다. up 데이트의 능력. 모든 업데이트는 이전 문서를 삭제 대상으로 표시한 다음 새 문서를 다시 삽입합니다.
자, 다시 본론으로 돌아가겠습니다.
첫 번째:
스프링 구성 추가
<bean id="client" factory-bean="esClientBuilder" factory-method="init" destroy-method="close"/> <bean id="esClientBuilder" class="com.***.EsClientBuilder"> <property name="clusterName" value="集群名称" /> <property name="nodeIpInfo" value="集群地址" /> </bean>
두 번째:
ES 매개변수를 초기화하는 EsClientBuilder 클래스 작성
package ***; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; public class EsClientBuilder { private String clusterName; private String nodeIpInfo; private TransportClient client; public Client init(){ //设置集群的名字 Settings settings = Settings.settingsBuilder() .put("client.transport.sniff", false) .put("cluster.name", clusterName) .build(); //创建集群client并添加集群节点地址 client = TransportClient.builder().settings(settings).build(); Map<String, Integer> nodeMap = parseNodeIpInfo(); for (Map.Entry<String,Integer> entry : nodeMap.entrySet()){ try { client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(entry.getKey()), entry.getValue())); } catch (UnknownHostException e) { e.printStackTrace(); } } return client; } /** * 解析节点IP信息,多个节点用逗号隔开,IP和端口用冒号隔开 * * @return */ private Map<String, Integer> parseNodeIpInfo(){ String[] nodeIpInfoArr = nodeIpInfo.split(","); Map<String, Integer> map = new HashMap<String, Integer>(nodeIpInfoArr.length); for (String ipInfo : nodeIpInfoArr){ String[] ipInfoArr = ipInfo.split(":"); map.put(ipInfoArr[0], Integer.parseInt(ipInfoArr[1])); } return map; } public String getClusterName() { return clusterName; } public void setClusterName(String clusterName) { this.clusterName = clusterName; } public String getNodeIpInfo() { return nodeIpInfo; } public void setNodeIpInfo(String nodeIpInfo) { this.nodeIpInfo = nodeIpInfo; } }
마지막:
이제 자체 서비스 클래스를 작성할 수 있습니다. 이 클래스는 작동할 수 있습니다. es의 기본 api(여기에 표시된 2.X 버전)를 통해 es
indexName은 데이터베이스 이름과 동일하고 typeName은 테이블 이름
package ***; @Service("esService") public class EsServiceImpl{ @Autowired private Client client; /** * 用docId获取document * @param indexName * @param typeName * @param docId */ private static void getWithId(String indexName, String typeName, String docId) { //get with id GetResponse gResponse = client.prepareGet(indexName, typeName, docId).execute().actionGet(); System.out.println(gResponse.getIndex()); System.out.println(gResponse.getType()); System.out.println(gResponse.getVersion()); System.out.println(gResponse.isExists()); Map<String, Object> results = gResponse.getSource(); if(results != null) { for(String key : results.keySet()) { Object field = results.get(key); System.out.println(key); System.out.println(field); } } } private static void indexWithBulk(String index, String type) { //指定索引名称,type名称和documentId(documentId可选,不设置则系统自动生成)创建document IndexRequest ir1 = new IndexRequest(); String source1 = "{" + "\"user\":\"kimchy\"," + "\"price\":\"6.3\"," + "\"tid\":\"20001\"," + "\"message\":\"Elasticsearch\"" + "}"; ir1.index(index).type(type).id("100").source(source1); IndexRequest ir2 = new IndexRequest(); String source2 = "{" + "\"user\":\"kimchy2\"," + "\"price\":\"7.3\"," + "\"tid\":\"20002\"," + "\"message\":\"Elasticsearch\"" + "}"; ir2.index(index).type(type).id("102").source(source2); IndexRequest ir3 = new IndexRequest(); String source3 = "{" + "\"user\":\"kimchy3\"," + "\"price\":\"8.3\"," + "\"tid\":\"20003\"," + "\"message\":\"Elasticsearch\"" + "}"; ir3.index(index).type(type).id("103").source(source3); BulkResponse response = client.prepareBulk().add(ir1).add(ir2).add(ir3).execute().actionGet(); BulkItemResponse[] responses = response.getItems(); if(responses != null && responses.length > 0) { for(BulkItemResponse r : responses) { String i = r.getIndex(); String t = r.getType(); System.out.println(i+","+t); } } } private static void sumCountSearch(String indexName, String typeName, String sumField, String countField, String searchField, String searchValue) { SumBuilder sb = AggregationBuilders.sum("sumPrice").field(sumField); TermQueryBuilder tb = QueryBuilders.termQuery(searchField, searchValue); SearchResponse sResponse = client.prepareSearch(indexName).setTypes(typeName).setQuery(tb).addAggregation(sb).execute().actionGet(); Map<String, Aggregation> aggMap = sResponse.getAggregations().asMap(); if(aggMap != null && aggMap.size() > 0) { for(String key : aggMap.keySet()) { if("sumPrice".equals(key)) { Sum s = (Sum)aggMap.get(key); System.out.println(key + "," + s.getValue()); } else if("countTid".equals(key)) { StatsBuilder c = (StatsBuilder)aggMap.get(key); System.out.println(key + "," + c.toString()); } } } } private static void updateDoc(String indexName, String typeName, String id) throws IOException, InterruptedException, ExecutionException { UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(indexName); updateRequest.type(typeName); updateRequest.id(id); updateRequest.doc(jsonBuilder().startObject().field("gender", "male").endObject()); UpdateResponse resp = client.update(updateRequest).get(); resp.getClass(); } private static void scrollSearch(String indexName, String typeName, String... ids) { IdsQueryBuilder qb = QueryBuilders.idsQuery().addIds(ids); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) .setSearchType(SearchType.SCAN) .setQuery(qb) .setScroll(new TimeValue(100)) .setSize(50) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); while (true) { SearchHits hits = sResponse.getHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < hitArray.length; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } sResponse = client.prepareSearchScroll(sResponse.getScrollId()).setScroll(new TimeValue(100)).execute().actionGet(); if (sResponse.getHits().getHits().length == 0) { break; } } } private static void deleteDocuments(String string, String string2) { SearchResponse sResponse = client.prepareSearch(string) .setTypes(string2) .setSearchType(SearchType.QUERY_THEN_FETCH) .setQuery(QueryBuilders.matchAllQuery()) .setFrom(0).setSize(60) .execute() .actionGet(); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); List<String> ids = new ArrayList<String>(hitArray.length); for(int i = 0; i < count; i++) { System.out.println("=================================="); SearchHit hit = hitArray[i]; ids.add(hit.getId()); } for(String id : ids) { DeleteResponse response = client.prepareDelete(string, string2, id).execute().actionGet(); } } private static void dateRangeSearch(String indexName, String typeName, String termName, String from, String to) { // 构建range query //2015-08-20 12:27:11 QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(from).to(to); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(qb) // 设置排序field .addSort(termName, SortOrder.DESC) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } private static void dateRangeSearch2(String indexName, String typeName, String termName, String from, String to) { // 构建range query QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(from).to(to); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(qb) // 设置排序field .addSort(termName, SortOrder.DESC) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } private static void countWithQuery(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) { //search result get source CountResponse cResponse = client.prepareCount(indexName) .setTypes(typeName) .setQuery(QueryBuilders.termQuery(termName, termValue)) .execute() .actionGet(); int tShards = cResponse.getTotalShards(); int sShards = cResponse.getSuccessfulShards(); System.out.println(tShards+","+sShards); long count = cResponse.getCount(); } private static void rangeSearchWithOtherSearch(String indexName, String typeName, String termName, String min, String max, String termQueryField) { // 构建range query QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(min).to(max); TermQueryBuilder tb = QueryBuilders.termQuery(termName, termQueryField); BoolQueryBuilder bq = boolQuery().must(qb).must(tb); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(bq) // 设置排序field .addSort(termName, SortOrder.DESC) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } private static void termRangeSearch(String indexName, String typeName, String termName, String min, String max, String highlightField) { QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(min).to(max); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(qb) // 设置排序field .addSort(termName, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } private static void sumOneField(String indexName, String typeName, String fieldName) { SumBuilder sb = AggregationBuilders.sum("sum").field(fieldName); //search result get source SearchResponse sResponse = client.prepareSearch(indexName).setTypes(typeName).addAggregation(sb).execute().actionGet(); Map<String, Aggregation> aggMap = sResponse.getAggregations().asMap(); if(aggMap != null && aggMap.size() > 0) { for(String key : aggMap.keySet()) { Sum s = (Sum)aggMap.get(key); System.out.println(s.getValue()); } } } private static void searchWithTermQueryAndRetureSpecifiedFields(String indexName, String typeName, String termName,String termValue, String sortField, String highlightField,String... fields) { SearchRequestBuilder sb = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(QueryBuilders.termQuery(termName, termValue)) // 设置排序field .addSort(sortField, SortOrder.DESC) // 设置高亮field .addHighlightedField(highlightField) // 设置分页 .setFrom(0).setSize(60); for (String field : fields) { sb.addField(field); } SearchResponse sResponse = sb.execute().actionGet(); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, SearchHitField> fm = hit.getFields(); for (String key : fm.keySet()) { SearchHitField f = fm.get(key); System.out.println(f.getName()); System.out.println(f.getValue()); } } } private static void searchWithIds(String indexName, String typeName, String sortField, String highlightField, String... ids) { IdsQueryBuilder qb = QueryBuilders.idsQuery().addIds(ids); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(qb) //设置排序field .addSort(sortField, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在index:indexName, type:typeName中做通配符查询 * @param indexName * @param typeName * @param termName * @param termValue * @param sortField * @param highlightField */ private static void wildcardSearch(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) { QueryBuilder qb = QueryBuilders.wildcardQuery(termName, termValue); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(qb) //设置排序field // .addSort(sortField, SortOrder.DESC) //设置高亮field // .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在index:indexName, type:typeName中做模糊查询 * @param indexName * @param typeName * @param termName * @param termValue * @param sortField * @param highlightField */ private static void fuzzySearch(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) { QueryBuilder qb = QueryBuilders.fuzzyQuery(termName, termValue); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(qb) //设置排序field .addSort(sortField, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在index:indexName, type:typeName中做区间查询 * @param indexName * @param typeName * @param termName * @param min * @param max * @param highlightField */ private static void numericRangeSearch(String indexName, String typeName, String termName, double min, double max, String highlightField) { // 构建range query QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(min).to(max); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(qb) // 设置排序field .addSort(termName, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在索引indexName, type为typeName中查找两个term:term1(termName1, termValue1)和term2(termName2, termValue2) * @param indexName * @param typeName * @param termName1 * @param termValue1 * @param termName2 * @param termValue2 * @param sortField * @param highlightField */ private static void searchWithBooleanQuery(String indexName, String typeName, String termName1, String termValue1, String termName2, String termValue2, String sortField, String highlightField) { //构建boolean query BoolQueryBuilder bq = boolQuery().must(termQuery(termName1, termValue1)).must(termQuery(termName2, termValue2)); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(bq) //设置排序field .addSort(sortField, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在索引indexName, type为typeName中查找term(termName, termValue) * @param indexName * @param typeName * @param termName * @param termValue * @param sortField * @param highlightField */ private static void searchWithTermQuery(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) { SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(QueryBuilders.termQuery(termName, termValue)) //设置排序field // .addSort(sortField, SortOrder.DESC) //设置高亮field // .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { System.out.println("=================================="); SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 用java的map构建document */ private static void indexWithMap(String indexName, String typeName) { Map<String, Object> json = new HashMap<String, Object>(); //设置document的field json.put("user","kimchy2"); json.put("postDate",new Date()); json.put("price",6.4); json.put("message","Elasticsearch"); json.put("tid","10002"); json.put("endTime","2015-08-25 09:00:00"); //指定索引名称,type名称和documentId(documentId可选,不设置则系统自动生成)创建document IndexResponse response = client.prepareIndex(indexName, typeName, "2").setSource(json).execute().actionGet(); //response中返回索引名称,type名称,doc的Id和版本信息 String index = response.getIndex(); String type = response.getType(); String id = response.getId(); long version = response.getVersion(); boolean created = response.isCreated(); System.out.println(index+","+type+","+id+","+version+","+created); } /** * 用java字符串创建document */ private static void indexWithStr(String indexName, String typeName) { //手工构建json字符串 //该document包含user, postData和message三个field String json = "{" + "\"user\":\"kimchy\"," + "\"postDate\":\"2013-01-30\"," + "\"price\":\"6.3\"," + "\"tid\":\"10001\"," + "}"; //指定索引名称,type名称和documentId(documentId可选,不设置则系统自动生成)创建document IndexResponse response = client.prepareIndex(indexName, typeName, "1") .setSource(json) .execute() .actionGet(); //response中返回索引名称,type名称,doc的Id和版本信息 String index = response.getIndex(); String type = response.getType(); String id = response.getId(); long version = response.getVersion(); boolean created = response.isCreated(); System.out.println(index+","+type+","+id+","+version+","+created); } private static void deleteDocWithId(String indexName, String typeName, String docId) { DeleteResponse dResponse = client.prepareDelete(indexName, typeName, docId).execute().actionGet(); String index = dResponse.getIndex(); String type = dResponse.getType(); String id = dResponse.getId(); long version = dResponse.getVersion(); System.out.println(index+","+type+","+id+","+version); } /** * 创建索引 * 注意:在生产环节中通知es集群的owner去创建index * @param client * @param indexName * @param documentType * @throws IOException */ private static void createIndex(String indexName, String documentType) throws IOException { final IndicesExistsResponse iRes = client.admin().indices().prepareExists(indexName).execute().actionGet(); if (iRes.isExists()) { client.admin().indices().prepareDelete(indexName).execute().actionGet(); } client.admin().indices().prepareCreate(indexName).setSettings(Settings.settingsBuilder().put("number_of_shards", 1).put("number_of_replicas", "0")).execute().actionGet(); XContentBuilder mapping = jsonBuilder() .startObject() .startObject(documentType) // .startObject("_routing").field("path","tid").field("required", "true").endObject() .startObject("_source").field("enabled", "true").endObject() .startObject("_all").field("enabled", "false").endObject() .startObject("properties") .startObject("user") .field("store", true) .field("type", "string") .field("index", "not_analyzed") .endObject() .startObject("message") .field("store", true) .field("type","string") .field("index", "analyzed") .field("analyzer", "standard") .endObject() .startObject("price") .field("store", true) .field("type", "float") .endObject() .startObject("nv1") .field("store", true) .field("type", "integer") .field("index", "no") .field("null_value", 0) .endObject() .startObject("nv2") .field("store", true) .field("type", "integer") .field("index", "not_analyzed") .field("null_value", 10) .endObject() .startObject("tid") .field("store", true) .field("type", "string") .field("index", "not_analyzed") .endObject() .startObject("endTime") .field("type", "date") .field("store", true) .field("index", "not_analyzed") .field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd'T'HH:mm:ss.SSSZ") .endObject() .startObject("date") .field("type", "date") .endObject() .endObject() .endObject() .endObject(); client.admin().indices() .preparePutMapping(indexName) .setType(documentType) .setSource(mapping) .execute().actionGet(); } }
Spring 프레임워크 Annotation 사용 코드 예시 상세 설명
2 .Java 트랜잭션 관리 학습을 위한 Spring 및 Hibernate의 자세한 코드 설명
3.Spring Boot를 사용하여 Restful 프로그램을 개발하는 방법에 대한 예제 튜토리얼 공유
4.spring mvc에서 지원하는 7가지 반환 메서드에 대한 자세한 설명
5.Aspect 기반 Spring의 향상된 구현 예제에 대한 자세한 설명
7. Java Spring mvc 작업 Redis 및 Redis 클러스터
위 내용은 봄에 Elasticsearch를 활용하는 실무 튜토리얼에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!