Spring solr 动态字段注解

Spring solr dynamic fields anotation

我正在尝试执行类似从文档中检索一个特定字段的查询,我在执行查询时没有出现运行时错误,但我没有得到我应该检索的 3 个字段从查询中,只有日期和来源,但没有变量,应该 return 的变量都是空值。 我如何 select 我只想在查询中检索的字段?

目前我的查询如下所示:

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

简介

阅读您的评论后,我发现对 SolrJSpring 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.

Spring Apache Solr 的数据是更大框架的一部分 Spring 数据并提供配置和从 Spring 应用程序访问 Apache Solr 搜索服务器(在内部与 Solr 对话使用 SolrJ)。

到目前为止,Solr Spring 数据版本。 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 数据版本是 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 不支持字段列表的占位符。

与其苦苦挣扎于 Solr Spring 数据,我建议扩展您的存储库 class 创建一个新的 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();
  }

}

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

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

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

  @Resource private SolrTemplate solrTemplate; // Create a SolrTemplate Bean


String QueryString = "*:*"; // all search query
String[] fields = {"Flight", "Hotel", "Car", "Bike"};
SimpleQuery query = new SimpleQuery(QueryString , new SolrPageRequest(0,10));
query.addProjectionOnFields(fields);
FilterQuery fq = new SimpleFilterQuery(new Criteria("Car").is(“Ford”)); // any Filter or criteria to build
query.addFilterQuery(fq);
Page<SolrDocumentPojo> resultPage= solrTemplate.query("CoreName ",queryString,Model.class);