【问题标题】:Elastic Search Java API Multi match query prefix query on tokensElastic Search Java API 多匹配查询前缀查询令牌
【发布时间】:2017-06-30 15:36:08
【问题描述】:

我正在寻找某种方式,我想使用来自 Elastic java api 的 NativeSearchQueryBuilder 对我的索引执行搜索,但我想在搜索时添加以下内容。 索引详情:

  1. 过滤器类型 EdgeNgram
  2. 空格分词器

我正在寻找自动完成功能,所以在这里我想在多个字段上应用搜索关键字,但它应该使用前缀来提高性能,我还希望如果结果达到我指定的页面限制,则需要返回结果即使找到足够的结果,也要继续搜索索引。

例如:“albert einstein”在我的索引中,现在如果我搜索“alb”它应该返回结果,或者如果我搜索“ein”它应该返回结果。

    NativeSearchQueryBuilder sb = new NativeSearchQueryBuilder()
            .withIndices(Constants.ES_INDEX_NAME)
            //.withPageable(pageable)
            .withSourceFilter(new FetchSourceFilterBuilder().withIncludes("id").build())
            .withTypes(Constants.USERS_TYPE)
            .withQuery(multiMatchQuery("alb", new String[]{"userFirstName","userLastName","userMobile", "userEmail"}))
            .withFilter(boolQuery()
                    .must(termQuery("userCityName", "Chicago")));

请有人帮我解决这个问题,如何为我的 Multimatch Query builder 添加前缀和限制。

【问题讨论】:

    标签: search elasticsearch n-gram


    【解决方案1】:

    你要找的是match_phrase_prefix

    int limit = 100; //Set your limit
    
    NativeSearchQueryBuilder sb = new NativeSearchQueryBuilder()
                .withIndices(Constants.ES_INDEX_NAME)
                .withPageable(new PageRequest(0, limit))
                .withSourceFilter(new FetchSourceFilterBuilder().withIncludes("id").build())
                .withTypes(Constants.USERS_TYPE)
                .withQuery(QueryBuilders.multiMatchQuery("alb", "userFirstName","userLastName","userMobile", "userEmail")
                                        .type(MatchQueryBuilder.Type.PHRASE_PREFIX))
                .withFilter(boolQuery()
                        .must(termQuery("userCityName", "Chicago")));
    

    【讨论】:

    • 谢谢它正在工作,但我想知道这个前缀查询会提高性能还是会降低性能,实际上我的索引有 80k 条记录,但检索结果的平均时间为 400 毫秒,看起来不错或者仍然可以提高性能,我使用 EdgeNGram 和空格标记器,最小 3 和最大 20 个字母。
    • 任何phraseprefix 都会降低搜索性能。您需要了解幕后发生的操作,短语或前缀匹配将查找标记,然后检查顺序,然后分配一个分数,这将比任何常规匹配花费更多时间,但使用 ES 的性能,您将不会感受到最大的差异的时间。 80k 文档的 400 毫秒似乎有点偏高,但这取决于您的文档大小和 ES 大小。
    • 一般来说,对于平均 1kb 的 80K 文档,最佳性能水平的数字是多少。
    • 我无法准确评论 80k 个文档,但对于我的案例,有 10 亿个文档,平均文档大小为 150kb,一个包含 2 到 3 个单词的常规匹配短语通常需要 100ms 到 150ms 之间的时间。
    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 2021-02-20
    • 2023-01-13
    • 1970-01-01
    • 2014-10-21
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多