Spring solr动态场anotation

时间:2017-05-29 21:45:14

标签: java solrj spring-data-solr

我正在尝试执行查询,例如从文档中检索一个特定字段,我在执行查询时不会遇到运行时错误但我没有得到3个字段i&#39 ; m应该从查询中检索,只是日期和原点,但没有变量,应该返回所有变量的变量都是空值。 如何选择我只想在查询中检索的字段?

目前我的查询如下:

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

2 个答案:

答案 0 :(得分:7)

简介

阅读你的评论我发现对SolrJSpring Data for Apache Solr的内容存在一些混淆 bokeh repository

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

  

SolrJ是一个API,可以让Java应用程序轻松与之交谈   Solr的。 SolrJ隐藏了许多连接到Solr和。的细节   允许您的应用程序通过简单的高级别与Solr交互   方法

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

到目前为止,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();
  }

}

答案 1 :(得分:0)

是的,您可以分别使用 SimpleQuery Object 和 Criteria 来做到这一点。

为要从存储库接口查询的方法创建一个自定义实现类,然后执行以下操作。

https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-dynamic-queries/

print(user.display_name) # Will print the nick if the user has it, otherwise the name