ElasticSearch: 搜索时注意类型匹配

假设索引中存在如下字段,其值为double类型(默认值为: 0.0):

1
2
3
"speed" : {
          "type" : "keyword"
        }

在搜索时应该写成如下格式(搜索条件为: 0.0 ):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET /es_info/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "phone": "13906666666"
        }},
        {"term": {
          "speed": 0.0
        }}
      ]
    }
  }
}

Java:

1
2
3
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("phone", "13906666666"));
queryBuilder.must(QueryBuilders.termQuery("speed", 0.0));

ElasticSearch: 脚本搜索

time的类型为:

1
2
3
4
"time" : {
          "type" : "date",
          "format" : "date_hour_minute_second"
        }

Kibana的开发工具中:

1
2
3
4
5
6
7
8
9
10
11
12
GET /es_info/_search
{
  "query": {
            "script": {
                "script": {
                    "source": "doc['time'].value.getHour() >= 0 && doc['time'].value.getHour() <= 6",
                    "lang": "painless"
                },
                "boost": 1.0
            }
  }
}

Java代码(依赖: spring-data-elasticsearch):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder().withFields("id", "time");
    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    // 判断时间范围.
    Map<String, Object> paramMap = new HashMap<>(2);
    paramMap.put("startHour", 0);
    paramMap.put("endHour", 6);
    Script script =
        new Script(
            ScriptType.INLINE,
            Script.DEFAULT_SCRIPT_LANG,
            "doc['time'].value.getHour() >= params.startHour && doc['time'].value.getHour() <= params.endHour",
            paramMap);
    queryBuilder.must(QueryBuilders.scriptQuery(script));
    Query query =
        nativeSearchQueryBuilder
            .withQuery(queryBuilder)
            .build();