[英]How to write elastic search code using lambda expression in java
Like C#(NEST), how can we write elastic search query using lambda expressions in JAVA. Below is the attached code which I have written using Elasticsearch JAVA client(HighlevelRestClient).像C#(NEST)一样,我们如何在JAVA中使用lambda表达式编写弹性搜索查询。下面是我使用Elasticsearch JAVA客户端(HighlevelRestClient)编写的附加代码。 How can I write the code using lambda to reduce complexity for the below code.如何使用 lambda 编写代码以降低以下代码的复杂性。
static Map<String,float> fields1=new HashMap<>();
map.put("field1",1f);
...
...
..
...
public static List<Result> getSearch(QueryFilter[] qf,List<String> filter2,String input,String filter3) {
SearchRequest searchRequest = new SearchRequest(esIndex);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.
should(new MultiMatchQueryBuilder(input).minimumShouldMatch("2").type("phrase").boost(5f).fields(fields1)).
should(new MultiMatchQueryBuilder(input).type("phrase").boost(5f).fields(fields2)).
should(new MultiMatchQueryBuilder(input).operator(Operator.AND).type("cross_fields").fields(fields2)).
should(new MultiMatchQueryBuilder(input).operator(Operator.OR).type("cross_fields").fields(fields3)).
should(new MultiMatchQueryBuilder(input).fuzziness("AUTO").type("best_fields").fields(fields4));
if(filter!=null && filter.length>0) {
BoolQueryBuilder boolFieldQuery = new BoolQueryBuilder();
for (QueryFilter qf : filter) {
boolFieldQuery.must(QueryBuilders.matchQuery(qf.getName(), qf.getValue()));
}
boolQueryBuilder.filter(boolFieldQuery);
}
if(!(filter2==null || filter2.isEmpty())) {
if(filter3==null || filter3.isEmpty() ) {
for (String string : filter2) {
boolQueryBuilder.should(new MultiMatchQueryBuilder(string).type("phrase_prefix").boost(10f).field("field1").field("field2"));
}
}
else {
for (String string : filter2) {
boolQueryBuilder.should(new MultiMatchQueryBuilder(string).type("phrase_prefix").boost(10f).field(filter3));
}
}
}
searchSourceBuilder.query(boolQueryBuilder).size(50).from(0).sort(new ScoreSortBuilder().order(SortOrder.DESC));
searchRequest.source(searchSourceBuilder);
try {
SearchResponse searchResponse = esclient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = searchResponse.getHits().getHits();
return Arrays.stream(hits).map(hit -> convert(hit.getSourceAsString(), Result.class)).collect(Collectors.toList());
} catch (Exception e) {
e.printStackTrace();
return new ArrayList<>();
}
}
public static <T> T convert(String string, Class<T> pojo) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
try {
return objectMapper.readValue(string, pojo);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
Really old question but it was the first search hit.确实是个老问题,但这是第一个搜索结果。 All of the should queries can be written as:所有应该查询都可以写成:
.should(s -> s
.multiMatch(m -> m
.minimumShouldMatch("2")
.type(TextQueryType.Phrase)
.boost(5f)
.fields(fields1);
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.