All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unlaxer.jaddress.JyuusyoJPSearcher Maven / Gradle / Ivy

package org.unlaxer.jaddress;

import java.io.Closeable;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.core.internal.io.IOUtils;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.unlaxer.jaddress.entity.jyuusyojp.JyuusyoJP;
import org.unlaxer.jaddress.entity.jyuusyojp.JyuusyoJPObject;

import net.arnx.jsonic.JSON;

public class JyuusyoJPSearcher implements Closeable{
	
	final ElaticeSearchAccessor elaticeSearchAccessor;
	
	public JyuusyoJPSearcher() {
		super();
		elaticeSearchAccessor = new ElaticeSearchAccessor();
	}
	
	public static void main(String[] args) throws IOException {
		
		Optional limit = Optional.of(1000);
		
		AtomicInteger counter = new AtomicInteger();
		
		
		TermQueryBuilder termQuery = QueryBuilders.termQuery("kenId", 1);
		
		try(JyuusyoJPSearcher jyuusyoJPSearcher = new JyuusyoJPSearcher()){
			
			
			
			try(Stream stream = jyuusyoJPSearcher.get("", limit)){
				stream.map(JSON::encode)
					.peek(x->counter.incrementAndGet())
					.forEach(System.out::println);
			}
		}
		System.out.println("count:" + counter.get());
	}
	
	
	public Stream get(String query , Optional limit) {
		
		try(RestHighLevelClient restHighLevelClient = elaticeSearchAccessor.get()){
			
			SearchRequest searchRequest = Indexes.ad_address.createSearchRequest();
			
			SearchSourceBuilder builder = new SearchSourceBuilder();
			
			limit.ifPresent(builder::size);
			
			
//			builder.query(QueryBuilders.termQuery("cityId", 1108));
//			builder.query(QueryBuilders.matchAllQuery());
//			builder.query(QueryBuilders.termQuery("cityName", "札幌市東区"));
			
			//https://medium.com/veltra-engineering/elasticsearch-fulltext-termlevel-772e8a9152b1
			builder.query(QueryBuilders.matchQuery("townName.keyword", "北十一条西"));

			
			SearchRequest source = searchRequest.source(builder);
			
			RequestOptions options = RequestOptions.DEFAULT;
			
			SearchResponse response = restHighLevelClient.search(source, options);
			
			RestStatus status = response.status();
			TimeValue took = response.getTook();
			Boolean terminatedEarly = response.isTerminatedEarly();
			boolean timedOut = response.isTimedOut();
			
			SearchHits hits = response.getHits();
			
			float maxScore = hits.getMaxScore();
			
			Stream stream = StreamSupport.stream(hits.spliterator(), false);
			
			Stream jyuusyoJps = stream.map(JyuusyoJPSearcher::from);
			
			return jyuusyoJps;
			
		} catch (IOException e) {
			
			e.printStackTrace();
			return Stream.empty();
		}
	}
	
	public static JyuusyoJP from(SearchHit searchHit) {
	
	JyuusyoJP jyuusyoJP = new JyuusyoJPObject();
	
	Field[] fields = JyuusyoJP.class.getFields();
	
	Map sourceAsMap = searchHit.getSourceAsMap();
	
//	System.out.println(JSON.encode(sourceAsMap));
	
	for (Field field : fields) {
		
		try {
			
			Object value  = sourceAsMap.get(field.getName());
			
			if(value != null ) {
				
				field.set(jyuusyoJP, value);
			}
			
		} catch (IllegalArgumentException | IllegalAccessException e) {
			
			throw new RuntimeException(e);
		}
	}
	return jyuusyoJP;
}


	@Override
	public void close() throws IOException {
		IOUtils.close(elaticeSearchAccessor);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy