es做搜索工具时中英文混合的情况会查询不出来内容

因为es会对搜索条件做分词处理,所以就会导致es查询的内容不是想要的
不过可以是有script的方式查询,但是效率很低很慢

方式一:

   // 创建一个Script,用于执行模糊匹配
                Script script = new Script(ScriptType.INLINE, "painless",                 "doc['plateNo.keyword'].value.contains(params.query)",
                        Collections.singletonMap("query", queryParam.getFieldValue().toString()));
  // 创建一个ScriptQueryBuilder,并将其包装在BoolQueryBuilder中,你也可以根据需求构建其他类型的查询
ScriptQueryBuilder scriptQuery = QueryBuilders.scriptQuery(script);
boolQuery.must(scriptQuery);

方式二:

 boolQuery.must(QueryBuilders.wildcardQuery("plateNo.keyword", "*" + queryParam.getFieldValue().toString() + "*"));

用NGINX反代了ES后 该怎么连接那?解决方案

因为客户是政府项目,端口要开放策略
所有采用用nginx反代es

因为连接后面多了一个/es/

# es 配置
elasticsearch:
  userName: elastic
  password: DrnFCKEAgsMNMSMH
  hosts: 10.68.182.147:80
  scheme: http
  connectTimeOut: 1000
  socketTimeOut: 30000
  connectionRequestTimeOut: 500
  maxConnectNum: 100
  maxConnectNumPerRoute: 100
  #nginx反代的目录
  contextPath: /es/

所有创建连接这里要改为

 /**
     * 如果@Bean没有指定bean的名称,那么方法名就是bean的名称
     */
    @Bean(name = "restHighLevelClient")
    public RestHighLevelClient restHighLevelClient() {
        // 构建连接对象
        RestClientBuilder builder = RestClient.builder(getEsHost());
        //这里就是nginx配置的反代目录 /es/
        if (StringUtils.isNotBlank(contextPath)) {
            builder.setPathPrefix(contextPath);
        }
        // 连接延时配置
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(connectTimeOut);
            requestConfigBuilder.setSocketTimeout(socketTimeOut);
            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
            return requestConfigBuilder;
        });

        // 连接数配置
        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(maxConnectNum);
            httpClientBuilder.setMaxConnPerRoute(maxConnectNumPerRoute);
            httpClientBuilder.setDefaultCredentialsProvider(getCredentialsProvider());
            return httpClientBuilder;
        });

        return new RestHighLevelClient(builder);
    }

ES深度分页查询报错 Result window is too large

Caused by: org.elasticsearch.ElasticsearchException: Elasticsearch exception [type=illegal_argument_exception, reason=Result window is too large, from + size must be less than or equal to: [5000] but was [321880]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.]
    at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:491) ~[elasticsearch-7.17.3.jar:7.17.3]
    at org.elasticsearch.ElasticsearchException.fromXContent(ElasticsearchException.java:402) ~[elasticsearch-7.17.3.jar:7.17.3]
    at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:432) ~[elasticsearch-7.17.3.jar:7.17.3]
    ... 122 common frames omitted

这个异常意味着你的Elasticsearch查询尝试返回的结果数量超出了默认限制。默认情况下,Elasticsearch限制从一个搜索请求返回的文档数量为10,000。在你的情况下,你尝试返回了321,880个文档,因此触发了异常。

为了解决这个问题,你可以考虑以下几种方法:

使用滚动API:滚动API是一种更有效地处理大型数据集的方法。它允许你在多个请求之间维护一个持久的搜索上下文,并在不同的请求之间获取文档批次。这样可以避免从整个数据集中一次性获取大量文档。

调整索引级别的设置:你可以通过更改索引级别的设置来增加index.max_result_window的值,以允许更大的结果窗口。但是,这种方法可能会导致内存压力增加,因为Elasticsearch需要在内存中维护大量的搜索上下文。

优化查询:如果可能的话,尝试优化你的查询以减少返回的文档数量。你可以使用更精确的查询条件,或者利用Elasticsearch的聚合功能来汇总数据而不是一次性返回所有文档。

分页处理:如果你需要返回的文档数量仍然较大,你可以考虑分页处理结果。每次请求只返回一部分文档,并根据需要逐步获取更多的文档。

根据你的具体需求和系统配置,选择最合适的方法来解决这个问题。

调整索引级别的设置这个怎么设置
要调整索引级别的设置,你需要修改Elasticsearch中索引的参数。具体来说,你需要修改index.max_result_window参数,该参数定义了从一个搜索请求返回的最大文档数目。

你可以通过以下步骤来修改这个参数:

使用任何支持HTTP请求的工具(如curl、Postman等),向Elasticsearch发送HTTP请求。

发送一个PUT请求,指定要修改的索引名称,以及新的index.max_result_window的值。例如:

PUT /your_index_name/_settings
{
  "index.max_result_window": 50000
}

上面的示例将your_index_name索引的index.max_result_window参数值设置为50,000。你可以将该值设置为你认为合适的任何值,以满足你的需求。

发送请求后,Elasticsearch会返回一个确认响应,表示设置已经成功应用。

请注意,修改索引级别的设置可能会对系统性能产生影响,特别是当你增加了返回文档的数量时。确保在修改参数之前仔细评估系统的资源和性能需求。

ES时间范围查询案例,并分页查询

 public PageInfo<BTCarGetoutLogs> queryPage(QueryVo queryParams, ProcessForm processForm, String tableName) {
        int pageNum = queryParams.getPageNum().intValue();
        int pageSize = queryParams.getPageSize().intValue();
        List<BTCarGetoutLogs> result = Lists.newArrayList();
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //并添加了多个查询条件。must 表示必须匹配的条件,mustNot 表示禁止匹配的条件,should 表示应该匹配的条件。你可以根据需要自由组合这些查询条件。
        for (ConditionVo queryParam : queryParams.getQueryParams()) {
            if (com.jinw.utils.StringUtils.isNotBlank(queryParam.getFieldName()) && queryParam.getFieldName().equals("PLATE_NO") &&
                    ObjectUtil.isNotEmpty(queryParam.getFieldValue())) {
                MatchPhrasePrefixQueryBuilder matchQueryBuilder1 = QueryBuilders.matchPhrasePrefixQuery("plateNo", queryParam.getFieldValue());
                // 添加到布尔查询的 should 子句中
                boolQuery.must(matchQueryBuilder1);
                break;
            }
        }
        for (ConditionVo queryParam : queryParams.getQueryParams()) {
            if (com.jinw.utils.StringUtils.isNotBlank(queryParam.getFieldName()) && queryParam.getFieldName().equals("CROSS_TIME") &&
                    ObjectUtil.isNotEmpty(queryParam.getFieldValue())) {
                WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("crossTime", "*" + queryParam.getFieldValue().toString() + "*");                // 添加到布尔查询的 should 子句中
                boolQuery.must(wildcardQuery);
                break;
            }
        }
        sourceBuilder.query(boolQuery);
        Long count = ESUtils.selectByCount("b_t_car_getout_logs", sourceBuilder);

        // 设置排序规则
        sourceBuilder.sort(SortBuilders.fieldSort("crossTime").order(SortOrder.DESC));
        List<Map<String, Object>> list = ESUtils.selectByPage("b_t_car_getout_logs", sourceBuilder, pageNum, pageSize);

        for (Map<String, Object> map : list) {
            Map<String, Object> filteredMap = map.entrySet().stream()
                    .filter(entry -> entry.getValue() != null && StringUtils.isNotBlank(entry.getValue().toString()) && !entry.getValue().equals("null"))
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
            BTCarGetoutLogs peopleInoutLogs = BeanUtil.mapToBean(filteredMap, BTCarGetoutLogs.class, false, CopyOptions.create().ignoreNullValue());
            result.add(peopleInoutLogs);
        }
        int totalPage = (int) Math.ceil((double) count / pageSize);
        PageInfo<BTCarGetoutLogs> pageInfo = new PageInfo<>(pageNum, pageSize, totalPage);
        pageInfo.setRecords(result);
        return pageInfo;
    }