编程语言
首页 > 编程语言> > java – Spring solr动态字段anotation

java – Spring solr动态字段anotation

作者:互联网

我正在尝试执行一个查询,就像从文档中检索一个特定字段,我在执行查询时没有获取运行时错误,但我没有得到我应该从查询中检索的3个字段,只是日期和原点,但没有变量,应该返回所有变量的变量都是空值.
我如何选择我只想在查询中检索的字段?

目前我的查询如下所示:

  @Query(value = "id:?0", fields = {"?1","date","origin"})
   List<Data> getRecord(String id,String field);

解决方法:

介绍

阅读你的评论我看到有一些关于什么是SolrJ和什么的混淆
Spring Data for Apache Solr.

SolrJ是Solr客户端(我个人也会添加标准和官方客户端).

SolrJ is an API that makes it easy for Java applications to talk to
Solr. SolrJ hides a lot of the details of connecting to Solr and
allows your application to interact with Solr with simple high-level
methods.

Apache Solr的Spring Data是更大的框架Spring Data的一部分,它提供了从Spring应用程序到Apache Solr Search Server的配置和访问(在内部与SolrJ谈论它使用SolrJ).

到目前为止,Solr Spring Data ver. 1.2.0.RELEASE依赖于SolrJ 4.7.2,它可能与Solr 6.2.0不兼容(当然,如果您使用的是SolrCloud).

鉴于此适当的介绍,我建议将Solr实例和SolrJ客户端保持在同一版本(或至少在相同的主要版本上).

所以对于Solr v.6.2.1,你应该使用SolrJ 6.2.1,但遗憾的是最新的Solr Spring Data版本是2.1.3.RELEASE(内部依赖于SolrJ 5.5.0).

<dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-solr</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency>
</dependencies>

你的问题

关于您没有收到所需字段列表的事实,只是Solr Data不支持字段列表的占位符.

我建议扩展你的Repository类,而不是与Solr Spring Data斗争,创建一个新的RepositoryImpl,使用简单而简单的SolrJ客户端添加自定义搜索.

@Component
public class ProductsRepositoryImpl implements ProductsRepositoryCustom {

  @Autowired
  private SolrServer   solrServer;

  public ProductsRepositoryImpl() {};

  public ProductsRepositoryImpl(SolrServer solrServer) {
    this.solrServer = solrServer;
  }

  public List<Map<String, Object>> findFields(String id, List<String> fields)
  {
    SolrQuery solrQuery = new SolrQuery("id:" + id);
    solrQuery.setFields(fields.toArray(new String[0]));
    try {
      QueryResponse response = this.solrServer.query(solrQuery);
      return response.getResults()
              .stream()
              .map(d ->
                {
                  return d.entrySet()
                          .stream()
                          .filter(e -> fields.contains(e.getKey()))
                          .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
                }).collect(Collectors.toList());
    } catch (SolrServerException e) {
      // TODO Auto-generated catch block
    }
    return Collections.emptyList();
  }

}

标签:java,solrj,spring-data-solr
来源: https://codeday.me/bug/20190611/1217432.html