当前位置: 首页 > 知识库问答 >
问题:

Spring Data Solr多核和存储库

栾和玉
2023-03-14

我有多核的apache solr,例如货币、国家等。。。因此,使用Spring Data Solr,我可以从一个核心检索信息。我现在已经获得了针对“货币”核心的XML配置查询。如果我想查询“国家”核心,我该如何设置?

<!-- Enable Solr repositories and configure repository base package -->
<solr:repositories base-package="com.acme.repository" solr-template-ref="solrCurrencyTemplate"/>

<solr:solr-server id="solrCurrencyServer" url="http://localhost:8983/solr/currency"/>

<bean id="solrCurrencyTemplate" class="org.springframework.data.solr.core.SolrTemplate">
    <constructor-arg ref="solrCurrencyServer" />
</bean>

并将存储库定义

@Repository
public interface CurrencyRepository extends SolrCrudRepository<Currency, String> {

}

通过我的服务,我可以做到这一点

@Override
public List<Currency> getCurrencies() {
    Page<Currency> currencies = (Page<Currency>) currencyRepository.findAll();
    return currencies.getContent();
}

我也尝试过使用@SolrDocument(solrCoreName=“currency”),但这行不通。

@SolrDocument(solrCoreName = "currency")
public class Currency {
    public static final String FIELD_CURRENCY_NAME = "currency_name";
    public static final String FIELD_CURRENCY_CODE = "currency_code";
    public static final String FIELD_DECIMALS = "decimals";

    @Id
    @Field(value = FIELD_CURRENCY_CODE)
    private String currencyCode;

    //currency_name,decimals
    @Field(value = FIELD_CURRENCY_NAME)
    private String currencyName;

    @Field(value = FIELD_DECIMALS)
    private String decimals;

...
...
...
}

我需要这个尽快的帮助...否则我将不得不回到RestTemboard解决方案:-(

希望有人能帮忙。谢谢GM

共有3个答案

丌官和泰
2023-03-14

Spring数据现在支持多个内核及其各自的存储库。

多再支持标志需要在EnableSolrRepositories注释中为true,并且需要告知相应的文档它们属于哪个核心。例如:

@SolrDocument(solrCoreName = "currency")
public class Currency
{
    // attributes
}

另一类应该是

@SolrDocument(solrCoreName = "country")
public class Country
{
    // attributes
}

相应的存储库应该知道他们正在使用什么pojo。

public interface CurrencyRepository extends SolrCrudRepository<Currency,String>
{
}

public interface CountryRepository extends SolrCrudRepository<Country,String>
{
}

和配置应为

@Configuration
@EnableSolrRepositories(value = "com.package.name",multicoreSupport = true)
public class SolrConfig
{
    @Bean
    public SolrServer solrServer() throws Exception
    {
        HttpSolrServerFactoryBean f = new HttpSolrServerFactoryBean();
        f.setUrl("http://localhost:8983/solr");
        f.afterPropertiesSet();
        return f.getSolrServer();
    }

    @Bean
    public SolrTemplate solrTemplate(SolrServer solrServer) throws Exception
    {
        return new SolrTemplate(solrServer());
    }
}
高嘉树
2023-03-14

遗憾的是,通过名称空间配置支持多核是一个尚未解决的问题。您需要为每个核心创建一个单独的SolrTemplate,并手动创建存储库。

@Autowired 
@Qualifier("solrCurrencyTemplate")
private SolrTemplate solrCurrencyTemplate;

@Autowired
@Qualifier("solrCountryTemplate")
private SolrTemplate solrCountryTemplate;

//...

CurrencyRepository currencyRepo = new SolrRepositoryFactory(this.solrCurrencyTemplate)
  .getRepository(CurrencyRepository.class);

CountryRepository countryRepo = new SolrRepositoryFactory(this.solrCountryTemplate)
  .getRepository(CountryRepository.class);
方宁
2023-03-14

我想我会分享,我们最近花了很多时间配置多个内核。我们用java做的,而不是xml。

作为Spring@配置的一部分,添加以下内容。

@Bean(name="solrCore1Template")
public SolrTemplate solrCore1Template() throws Exception {
    EmbeddedSolrServer embeddedSolrServer = new EmbeddedSolrServer(getCoreContainer(), "core1");
    return new SolrTemplate(embeddedSolrServer);
}

@Bean(name="solrCore2Template")
public SolrTemplate solrCore2Template() throws Exception {   
    EmbeddedSolrServer embeddedSolrServer = new EmbeddedSolrServer(getCoreContainer(), "core2");
    return new SolrTemplate(embeddedSolrServer);
}

@Bean
@Scope
public CoreContainer getCoreContainer() throws FileNotFoundException{
    String dir = <path_to_solr_home>;
    System.setProperty("solr.solr.home", dir);
    CoreContainer.Initializer initializer = new CoreContainer.Initializer();
    return initializer.initialize();
}

要使用每个模板,请在服务类中使用,如下所示。

@Resource
private SolrTemplate solrCore1Template;

嵌入式服务器可以使用以下代码与HTTP进行中继。

HttpSolrServer httpSolrServer = new HttpSolrServer(getSolrURL());
return new SolrTemplate(httpSolrServer, "core1");

希望这能有所帮助。我知道对于所问的问题,这是一个很晚的回答。

 类似资料:
  • 问题内容: 我的apache solr具有多个核心,例如货币,国家等。因此,使用Spring Data Solr可以从一个核心中检索信息。我现在已经获得了针对“ currency”核心的XML配置。如果我想查询“国家”核心,该如何设置? 并将存储库定义为 从我的服务中我可以做到这一点 我也尝试过使用@SolrDocument(solrCoreName =“ currency”),但是这行不通。 我

  • 我想使用SpringDataSolr在一个服务中访问多个/2个repo。从SpringDataSolr多核和存储库中,我知道“不幸的是,通过名称空间配置支持多核是一个开放的问题”。 你能帮我举个例子吗?我怎样才能创建自定义回购协议? 我的应用程序Context.xml有两个Solr模板定义如下: 我有以下回购协议 最后,服务如下所示: 有人能告诉我如何修改代码以实现SpringDataSolrWi

  • 我想知道,当我们为客户提供新的更新时,是否有丢失这些文件的风险。如果有更好的解决方案,上传文件和获取文件链接之后,与.NET core请告诉我:)

  • 对于使用具有多核支持的存储库使用solr设置Spring数据,是否有详细而完整的解释?

  • 这两个URL之间有区别吗?一个直接指向mp4,然后另一个URL是“下载链接”?有区别吗? 在谷歌云平台中有这样存储文件的选项吗?

  • 我想使用Spring LDAP 设置多个 LDAP 存储库。我的目标是同时在所有存储库中创建或更新对象。 我使用LdapRepository Spring接口,我认为目前这是不可能的。 我想知道我是否可以创建自己的LdapRepository来扩展Spring,但是我不知道如何开始。 这是我的配置: 完整地说,一个存储库: 知道怎么做吗? 提前感谢任何帮助。