spring-data-elasticsearch 在多个索引上搜索

2024-04-09

我的页面上有一个搜索字段,该搜索字段应该搜索多个索引。 我可以毫无问题地搜索一个索引,如 spring-data-elasticsearch 文档中所述。

但是,如果我搜索,例如“Foo”,我希望得到以下列表作为按相关性排序的结果:

{ title: "Foo" } -> Entity: Sample
{ name: "FooTest" } -> Entity: Test
{ title: "FooSample2" } -> Entity: Sample
// ...and so on
// The entities are not part of the same parent. So, they are complete different.

为此,我在文档中找不到任何对我有帮助的内容。

有人可以帮忙吗?

EDIT:

final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery())
                .withIndices("game-index", "lets-play-index", "video-index", "genre-index", "platform-index", "user-index")
                .withPageable(new PageRequest(0, 10))
                .build();

            // when
            final Page<SearchResult> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SearchResult.class, new SearchResultMapper() {

                @Override
                public <T> FacetedPage<T> mapResults(
                                                        final SearchResponse response,
                                                        final Class<T> clazz,
                                                        final Pageable pageable) {
                    LoggerUtil.get(this.getClass())
                        .debug(response.toString());
                    LoggerUtil.get(this.getClass())
                        .debug(response.getHits()
                            .toString());
                    LoggerUtil.get(this.getClass())
                        .debug("TotalHits: " + response.getHits()
                            .totalHits());

                    final long totalHits = response.getHits()
                        .totalHits();
                    final List<T> results = new ArrayList<T>();
                    for (final SearchHit hit : response.getHits()) {
                        LoggerUtil.get(this.getClass())
                            .debug(hit.sourceAsString());
                        if (hit != null) {
                            final T result = null;
                            /*
                             * if (!Strings.isNullOrEmpty(hit.sourceAsString()))
                             * { result = mapEntity(hit.sourceAsString(),
                             * clazz); } else { result =
                             * mapEntity(hit.getFields() .values(), clazz); }
                             */
                            // setPersistentEntityId(result, hit.getId(),
                            // clazz);
                            results.add(result);
                        }
                    }
                    final List<FacetResult> facets = new ArrayList<FacetResult>();
                    if (response.getFacets() != null) {
                        for (final Facet facet : response.getFacets()) {
                            final FacetResult facetResult = DefaultFacetMapper.parse(facet);
                            if (facetResult != null) {
                                facets.add(facetResult);
                            }
                        }
                    }

                    return new FacetedPageImpl<T>(results, pageable, totalHits, facets);
                }

            });

搜索结果映射器内部的响应如下:

{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 30,
    "successful" : 30,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}

如果我用这个做一个简单的搜索:

final Class<?> clazz = Class.forName(className);

            final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(getQueryBuilderForQuery(query))
                .build();
            final List<?> results = elasticsearchTemplate.queryForList(searchQuery, clazz);

它有效并且我得到了很多结果。这意味着我的索引正在工作。

我绝对不知道我能做什么。多谢。


抱歉,这已经支持了

尝试下面的代码,它应该可以工作......

但是下面的代码适用于实体和弹性搜索文档中具有相同结构的情况

    @Test
    public void shouldTestResultsAcrossMultipleIndices() {
    // given
    String documentId1 = randomNumeric(5);
    SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId1).message("some message")
            .version(System.currentTimeMillis()).build();

    IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId())
            .withIndexName("test-index-1")
            .withObject(sampleEntity1)
            .build();

    String documentId2 = randomNumeric(5);
    SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2).message("some test message")
            .version(System.currentTimeMillis()).build();

    IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId())
            .withIndexName("test-index-2")
            .withObject(sampleEntity2)
            .build();

    elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2));
    elasticsearchTemplate.refresh("test-index-1", true);
    elasticsearchTemplate.refresh("test-index-2", true);

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(matchAllQuery())
            .withIndices("test-index-1", "test-index-2")
            .build();
    // when
    List<SampleEntity> sampleEntities = elasticsearchTemplate.queryForList(searchQuery, SampleEntity.class);
    // then
    assertThat(sampleEntities.size(), is(equalTo(2)));
}

如果索引中有不同的结构,那么您可以使用下面的elasticsearchTemplate方法

  Page<T> queryForPage(SearchQuery query, Class<T> clazz, SearchResultMapper mapper);

还困惑吗? 很高兴能帮助你 :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring-data-elasticsearch 在多个索引上搜索 的相关文章

随机推荐

  • 在 Python 中使用多个列表的 For 循环[重复]

    这个问题在这里已经有答案了 我正在寻找解决我的问题的方法 目前我有两个元素列表 column width 3 3 6 8 4 4 4 4 fade 100 200 300 我想要实现的是创建 for 循环 它将给出以下输出 column 3
  • 随机生成密码 Rails 3.1

    为了开发一个新的网络应用程序 我的注册页面 仅限管理员 只需要一个电子邮件字段 问题是我对 Rails 完全陌生 所以即使是像这样的基础知识对我来说也非常困难 我使用 Railscast 270 创建了我的身份验证 它使用有安全密码方法 现
  • Java 中最快的循环同步是什么(ExecutorService、CyclicBarrier、X)?

    哪种 Java 同步结构可能提供最好的 并发 迭代处理场景的性能 像下面概述的那样固定数量的线程 实验后 我自己呆了一段时间 使用 ExecutorService 和 CyclicBarrier 并且 对结果有些惊讶 我会感激一些 专家建议
  • 比较对象 - 单独的侧列

    是否可以显示PowerShell的结果Compare Object在两列中显示参考对象与差异对象的差异 例如使用我当前的命令行 Compare Object Base Test Gives InputObject SideIndicator
  • 在电子邮件中嵌入图片

    我目前有一个程序 可以从列表中随机选择报价并通过电子邮件发送 我现在也尝试在电子邮件中嵌入图像 我遇到了一个问题 我可以附加电子邮件 但我的报价不再有效 我在网上研究过 但解决方案对我不起作用 请注意 我使用的是 Python 3 2 2
  • 发现循环依赖问题

    我正在设计一个系统 其中有两个模块 一个用于管理文件 另一个用于用户 对于某些逻辑运算 它们需要彼此提供的服务 每个模块都由一个单例表示 该单例实现一个相互提供一些服务的接口 并通过抽象工厂来提供它们 如下所示 public class U
  • 如何使 Pinia 商店热重载更改?

    import defineStore acceptHMRUpdate from pinia import v4 as uuidv4 from uuid export const useStoreNotes defineStore store
  • 解耦与 YAGNI

    他们矛盾吗 解耦是一件伟大但很难实现的事情 然而 在大多数应用程序中 我们并不真正需要它 所以我可以设计高度耦合的应用程序 它几乎不会改变任何明显的副作用 例如 你不能分离组件 单元测试是痛苦的 屁股 等 你怎么认为 您是否总是尝试解耦并处
  • 在python中添加小时到unix时间戳

    我需要在某个 UNIX 时间戳上添加 5 小时 就像游戏的开始和停止时间一样 所以我知道比赛的开始时间和持续时间 我需要设置结束时间 这如何在 python 中完成 UNIX 时间戳以秒为单位 end timestamp start tim
  • Gradle 额外属性在子项目中定义的自定义任务中不可见

    我正在尝试在多个 Gradle 任务之间重用通用逻辑 类似于中建议的内容这个答案 https stackoverflow com a 13072481 但我遇到了额外项目属性不可见的问题 归根结底 问题就在这里 假设我有一个根 Gradle
  • 如何在haskell中反转整数?

    我需要有关如何逆转的帮助Integer在 Haskell 中具有以下类型签名 reverseInt Integer gt Integer reverseInt a undefined help here 我需要Integer输入要反转的数字
  • 具有多个条目的 Rails 嵌套形式

    我有一个Sezzion model attr accessible description has many session instructors dependent gt destroy has many instructors thr
  • Apache 和 PHP 的默认 Windows 用户

    查看 Windows XP 上运行的进程 发现 Apache httpd exe 在 SYSTEM 用户下运行 但我不知道什么 User 用于运行 PHP 脚本 这是使用 Xampp 的基本安装 我试图在目录上设置正确的权限 即 Modif
  • 附加 mdf 文件时 SQL Server 版本错误

    标题 Microsoft SQL Server Management Studio 服务器 DESKTOP MR6JCUA 附加数据库失败 微软 SqlServer Smo 附加信息 执行 Transact SQL 语句或批处理时发生异常
  • 如何在 Interface Builder 中创建许多溢出到 xib 之外的元素

    我有一个 UIView 其中有很多元素 如文本字段 日期选择器和选择器视图 可以将数据添加到我的应用程序 这不会出现在 Interface Builder 的屏幕中 在我看来 用户将向下滚动以插入它们 有办法实现这一点吗 Thanks 如何
  • 融合乘加和默认舍入模式

    使用 GCC 5 3 可以编译以下代码 O3 fma float mul add float a float b float c return a b c 产生以下程序集 vfmadd132ss xmm1 xmm2 xmm0 ret 我注意
  • 输出发送到浏览器后设置 cookie

    有没有办法可以在 html 输出后设置 cookie 根据 PHP 手册 setcookie 应该设置before输出 我的投票系统需要它 其中在成功的 Mysql 查询后将设置一个 cookie 我把它放在一个文件中 您可以使用输出缓冲区
  • Android Studio 无法识别 Samsung Galaxy 手机

    我的三星手机在 Windows 7 上无法被 Android Studio 识别 我通过在此处安装 Samung 驱动程序来修复它 http developer samsung com technical doc view do v T00
  • Firebase JWT:签名验证失败

    我尝试在 Firebase 中使用 JWT 身份验证 但总是收到此错误 致命错误 未捕获的 Firebase JWT SignatureInvalidException 签名验证失败 代码是这样的 key test tokenId base
  • spring-data-elasticsearch 在多个索引上搜索

    我的页面上有一个搜索字段 该搜索字段应该搜索多个索引 我可以毫无问题地搜索一个索引 如 spring data elasticsearch 文档中所述 但是 如果我搜索 例如 Foo 我希望得到以下列表作为按相关性排序的结果 title F