【问题标题】:How to write elastic search code using lambda expression in java如何在java中使用lambda表达式编写弹性搜索代码
【发布时间】:2022-04-02 01:49:30
【问题描述】:

像 C#(NEST) 一样,我们如何在 JAVA 中使用 lambda 表达式编写弹性搜索查询。下面是我使用 Elasticsearch JAVA client(HighlevelRestClient) 编写的附加代码。如何使用 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);
        }
    }

【问题讨论】:

    标签: java elasticsearch elastic-stack


    【解决方案1】:

    确实是老问题,但它是第一个搜索结果。所有的 should 查询都可以写成:

    .should(s -> s
      .multiMatch(m -> m
        .minimumShouldMatch("2")
        .type(TextQueryType.Phrase)
        .boost(5f)
        .fields(fields1);
      )
    )
    

    【讨论】:

      猜你喜欢
      • 2020-07-24
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多