2015-10-05 102 views
2

我正在使用Jhipster項目生成器來創建一個基本的CRUD應用程序。該應用程序使用org.spingframework.data.elasticsearch進行搜索功能。我有一個客戶域和一個地址域,如下所示。Spring數據Elasticsearch嵌套搜索 - jhipster

/** 
* A Customer. 
*/ 
@Entity 
@Table(name = "CUSTOMER") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
@Document(indexName="customer") 
public class Customer implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "forename") 
    private String forename; 

    @Column(name = "surname") 
    private String surname; 

    @ManyToOne 
    @Field(type = FieldType.Nested) 
    private Address address; 
} 

/** 
* An Address. 
*/ 
@Entity 
@Table(name = "ADDRESS") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
@Document(indexName="address") 
public class Address implements Serializable { 



@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Min(value = 1) 
    @Max(value = 9999)   
    @Column(name = "number") 
    private Long number; 

    @NotNull 
    @Size(min = 5, max = 50)   
    @Column(name = "line1", length = 50, nullable = false) 
    private String line1; 

    @Size(min = 5, max = 50)   
    @Column(name = "line2", length = 50) 
    private String line2; 

    @NotNull 
    @Size(min = 2, max = 50)   
    @Column(name = "city", length = 50, nullable = false) 
    private String city; 

    @Size(min = 2, max = 50)   
    @Column(name = "county", length = 50) 
    private String county; 

    @Size(min = 2, max = 50)   
    @Column(name = "country", length = 50) 
    private String country; 

    @NotNull 
    @Size(min = 7, max = 8)   
    @Column(name = "postcode", length = 8, nullable = false) 
    private String postcode; 

} 

每個客戶都有一個地址。我有一個多對一的映射,所以每個地址可以有很多客戶。

現在在我的資源中,我有以下搜索查詢。

/** 
    * SEARCH /_search/customers/:query -> search for the customer corresponding 
    * to the query. 
    */ 
    @RequestMapping(value = "/_search/customers/{query}", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
    @Timed 
    public List<Customer> searchCustomers(@PathVariable String query) { 
     return StreamSupport 
      .stream(customerSearchRepository.search(queryString(query)).spliterator(), false) 
      .collect(Collectors.toList()); 
    } 

目前這將返回一個客戶名單,根據我輸入的任何標準很像使用搜索引擎。但是,搜索不會與客戶域中的地址字段匹配。理想情況下,我想在特定的郵政編碼中搜索某個客戶姓氏,但目前只能匹配不是地址的客戶字段。如果我修改搜索查詢以使用findByPostcode或沿着這些行的東西,然後我失去了搜索客戶名稱/細節的能力。

簡而言之,我該如何根據客戶詳細信息字段和客戶地址字段進行搜索,而無需對數據庫進行反規範化處理?

回答

1

不需要在地址中的文檔註釋,我的意思是:

`@ManyToOne 
@Field(type = FieldType.Nested) 
private Address address;` 

應該是:

`@ManyToOne 
private Address address;` 
+0

感謝您的建議。我創建了一個新的測試項目來重新審視這個問題,並且我已經按照自己的意願開展工作。不知道是否因爲這次我沒有使用DTO。 –

+0

不客氣 –