弹性搜索:不会始终返回突出显示的字段

时间:2017-04-25 19:49:11

标签: java elasticsearch highlighting

使用Java API,我需要能够检索与查询关联的字段/突出显示字段。因此,我将_all字段(或其他*)添加到查询中,并将突出显示的字段添加到响应中。 它大部分时间都有效,但并非总是如此。这是一个片段:

        final BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        Arrays.asList(query.split(" "))
                .stream()
                .map(QueryParser::escape)
                .map(x -> String.format("*%s*", x))
                .forEach(x -> {
                    boolQueryBuilder.should(
                            QueryBuilders.queryStringQuery(x)
                                    .field("_all")
                                    .allowLeadingWildcard(true));
                });

        SearchResponse response = client
                .prepareSearch()
                .setSize(10)
                .addHighlightedField("*")
                .setHighlighterRequireFieldMatch(false)
                .setQuery(boolQueryBuilder)
                .setHighlighterFragmentSize(40)
                .setHighlighterNumOfFragments(40)
                .execute()
                .actionGet();

对于为什么field字段以及highlightedField并不总是在响应中可以访问,因为它在技术上总是被查询?

1 个答案:

答案 0 :(得分:0)

不确定,但我认为您可能正在寻找: -

String aQueryWithPartialSerach = null;
final BoolQueryBuilder aBoolQueryBuilder = new BoolQueryBuilder();

 // Enabling partial sarch
        if (query.contains(" ")) {
            List<String> aTokenList = Arrays.asList(query.split(" "));
            aQueryWithPartialSerach = String.join(" ", aTokenList.stream().map(p -> "*" + p + "*").collect(Collectors.toList()));
        } else {
            aQueryWithPartialSerach = "*" + query + "*";
        }

aBoolQueryBuilder.should(QueryBuilders.queryStringQuery(aQueryWithPartialSerach));