Elasticsearch7.30 结合ik分词器使用过程中的问题整理

Elasticsearch7.30 使用过程中的问题整理

  • 我在使用Elasticsearch7.30 结合ik分词器时 不生效 遇到的坑
  • 上代码
  • 需要注意的地方:

我在使用Elasticsearch7.30 结合ik分词器时 不生效 遇到的坑

在使用es分词器的时候,配置了ik分词器,不过在后来的实际应用中发现ik分词器并没有真正生效,后来查了一些资料,是要在创建创建索引的时候,就要指定好这个索引的默认分词方式 比如’ik_max_word’,然后再进行数据的导入,最后查询的时候,指定分词方式’ik_max_word’;

上代码

我这里用的是jestclient连接es

  @Autowired
    private JestClient jestClient;

	public Result selectAllDataForEs() {
        // 1.先删除es库的原始数据
        JestResult jr = null;
        boolean bool = false;
        try {
            jr = jestClient.execute(new DeleteIndex.Builder("national_tax_law_library").build());
            bool = jr.isSucceeded();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 设置默认分词方式为ik_max_word
        String settings = "{\n" +
                "        \"index\" : {\n" +
                "            \"analysis.analyzer.default.type\": \"ik_max_word\"\n" +
                "        }\n" +
                "    }";
       // 先创建索引并设置默认分词方式
        CreateIndex createIndex = new CreateIndex.Builder("national_tax_law_library").settings(settings).build();
        try {
            jestClient.execute(createIndex);
        } catch (IOException e) {
            e.printStackTrace();
            LogUtils.error(e.getMessage());
        }
        // 这里从数据库拿出要插入es中的数据
        List<ESearchNationalTaxLawLibrary> eSearchNationalTaxLawLibraries = nationalTaxLawLibraryService.selectAllDataForEs(null);
        Bulk.Builder bulkNew = new Bulk.Builder().defaultIndex("national_tax_law_library").defaultType("national_tax_law_library_type"); 
        for (ESearchNationalTaxLawLibrary item : eSearchNationalTaxLawLibraries) {
        // 构建数据
            Index index = new Index.Builder(item).build();
            bulkNew.addAction(index);
        }
        try {
        // 批量导入数据到es
            JestResult jestResult = jestClient.execute(bulkNew.build());
            LogUtils.debug("ES 插入完成");
        } catch (IOException e) {
            e.printStackTrace();
            LogUtils.error(e.getMessage());
        }
        return ResultGenerator.genSuccessResult();
    }
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 构建查询参数事指定分词方式为'ik_max_word'
boolQueryBuilder.should(QueryBuilders.matchPhraseQuery("title", param.getKeyWord()).boost(2.0f).analyzer("ik_max_word"));
boolQueryBuilder.should(QueryBuilders.matchPhraseQuery("clauseText", param.getKeyWord()).boost(1.0f).analyzer("ik_max_word"));

需要注意的地方:

  • 总结: 在创建索引库的时候,就要创建好这个库的分词方式,然后再导入数据, 最后搜索的时候,指定一下分词方式;先导入数据,再配置分词方式,不会生效的
  • 如果有不正确的地方还请各位大佬指正,

你可能感兴趣的:(es)