2017-04-25 47 views
0

使用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並不總是在響應訪問因爲它在技術上總是詢問?

+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));