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