簡體   English   中英

Spring solr 動態字段注解

[英]Spring solr dynamic fields anotation

我正在嘗試執行類似從文檔中檢索一個特定字段的查詢,在執行查詢時我沒有得到運行時錯誤,但我沒有得到我應該從查詢中檢索的 3 個字段,只是日期和原點,但沒有變量,應該返回所有這些的變量是空值。 如何選擇我只想在查詢中檢索的字段?

目前我的查詢是這樣的:

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

簡介

閱讀您的評論,我發現對於什么是SolrJSpring Data for Apache Solr存在一些混淆。

SolrJ 是 Solr 客戶端(我個人也會添加標准和官方客戶端)。

SolrJ 是一種 API,它使 Java 應用程序可以輕松地與 Solr 對話。 SolrJ 隱藏了許多連接到 Solr 的細節,並允許您的應用程序使用簡單的高級方法與 Solr 交互。

Spring Data for Apache Solr 是更大框架 Spring Data 的一部分,並提供從 Spring 應用程序對 Apache Solr Search Server 的配置和訪問(為了與 Solr 在內部對話,它使用 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 不支持字段列表的占位符。

與其在 Solr Spring Data 上苦苦掙扎,我建議擴展您的 Repository 類,創建一個新的 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 來做到這一點。

為要從存儲庫接口查詢的方法創建一個自定義實現類,然后執行以下操作。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM