MatchQuery一般应用于全文检索场景,作用于Text类型字段。不管是Text还是MatchQuery的内容,都会按照配置好的分词器做切分。如果是Query,则会按照切分好后的Term去查询。

比如某一行数据的title字段值是:“杭州西湖风景区”,使用单字分词,那么如果MatchQuery中的查询词是:“湖风”,就可以命中这一行数据。

参数

  • fieldName:字段名,在哪个字段上查询。
  • text:查询词,该词会被分词成多个Term。
  • minimumShouldMatch:只有某一行数据的fieldName字段的值中至少包括了minimumShouldMatch个term才会返回这一行数据,否则认为不命中。
  • operator:关系符,默认是Or,也就是说分词后的多个term只要有部分命中,就认为命中。如果是And,则需要分词后的所有Term都在字段值中有才算命中。

示例

/**
 * 查询表中Col_Keyword这一列的值能够匹配"hangzhou"的数据,返回匹配到的总行数和一些匹配成功的行。
 * @param client
 */
private static void matchQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    MatchQuery matchQuery = new MatchQuery(); // 设置查询类型为MatchQuery
    matchQuery.setFieldName("Col_Keyword"); // 设置要匹配的字段
    matchQuery.setText("hangzhou"); // 设置要匹配的值
    searchQuery.setQuery(matchQuery);
    searchQuery.setOffset(0); // 设置offset为0
    searchQuery.setLimit(20); // 设置limit为20,表示最多返回20行数据
    SearchRequest searchRequest = new SearchRequest(TABLE_NAME, INDEX_NAME, searchQuery);
    SearchResponse resp = client.search(searchRequest);
    System.out.println("TotalCount: " + resp.getTotalCount());
    System.out.println("Row: " + resp.getRows()); // 不设置columnsToGet,默认只返回主键

    SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    columnsToGet.setReturnAll(true); // 设置返回所有列
    searchRequest.setColumnsToGet(columnsToGet);

    resp = client.search(searchRequest);
    System.out.println("TotalCount: " + resp.getTotalCount()); // 匹配到的总行数,非返回行数
    System.out.println("Row: " + resp.getRows());
}