1

我是彈性和彈簧數據彈性的新手。我一直在這裏和網絡的其他領域尋找,但到目前爲止一直無法找到我的問題的答案。我希望SO可以提供幫助。如何用彈簧數據彈性查詢彈性

我索引從我Users表(名字,姓氏)一些記錄,我希望能夠讓高級搜索。例如,如果我有'Frances'這個名字,並且輸入'Frank',那麼這個系統足夠聰明,可以返回記錄。同爲「臣」和「Robinsen」等

我設置我的POJO是以下幾點:

Public Users { 
    @Field(fieldType = FieldType.String) 
    private String firstName; 

    @Field(fieldType = FieldType.String) 
    private String lastName 

    // mutators 
    ... 

} 

目前我使用的是彈簧數據彈性ElasticRepository做我的搜索,如果我準備進行高級搜索,我相信這可能會改變。一種選擇是直接在UserService中使用EntityManagerTemplate,但我不確定如何去做。

正如我所描述的問題,這是一個索引問題或搜索問題或可能兩者?我不是在尋找任何人來完成這項工作,只是爲了讓我指向正確的方向。

謝謝!

+0

你吃過看看http://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.query-methods? 順便說一句,EntityManager是JPA的概念,而不是elasticsearch,所以在這個方向上搜索沒有意義。 – GPI

+0

你是對的,這是一個JPA的概念,所以它不適合這裏。我已閱讀您鏈接到的文檔,但我仍然不知道如何設置它以允許模糊邏輯。這是一個查詢問題嗎?索引問題?我是否需要更改我的域名實體? – Dan

+0

快速搜索不提供從方法名稱生成自動*模糊*查詢的方法,但您始終可以使用[基於條件](http://docs.spring.io/spring-data/elasticsearch/docs /current/api/org/springframework/data/elasticsearch/core/query/Criteria.html#fuzzy-java.lang.String-)ones或[hand written](http://docs.spring.io/spring-data /elasticsearch/docs/current/reference/html/#elasticsearch.query-methods.at-query)。 – GPI

回答

3

首先,有沒有自動模糊查詢生成支持,至於documentation tells

因此,我們將不得不使用定製庫的方法補充。

說你的基礎信息庫是

@Repository 
public interface UserRepository extends CrudRepository<UserEntity, Long> 

你必須創建一個自定義庫界面,您添加自定義的方法(這是所有standard Spring data,有什麼特別的)

public interface UserRepositoryCustom { 
    public List<User> findFuzzyByLastNameAndFirstName(String firstName, String lastName); 
} 

,使您的歷史回購實施此界面,即:

@Repository 
public interface UserRepository extends CrudRepository<UserEntity, Long>, UserRepositoryCustom 

現在,您需要以某種方式實現您的「自定義」界面。這是很容易(再次看到手冊,你必須尊重命名方案,使彈簧可以線在運行時接口和實現):

public class UserRepositoryCustomImpl implements UserRepositoryCustom { 
    @Autowired protected ElasticsearchTemplate elasticsearchTemplate; 

    public List<User> findFuzzyByLastNameAndFirstName(String firstName, String lastName) { 
     Criteria c = new Criteria("firstName").fuzzy(firstName).and(new Criteria("lastName").fuzzy(lastName)); 
     return elasticsearchTemplate.queryForList(new CriteriaQuery(c), CandidateEntity.class); 
    } 
} 

重新編譯,重新開張,你應該可以有你的版本庫像這樣的模糊搜索。

話又說回來(見問題的意見),你可能還需要定義查詢作爲一個字符串,你就不需要自定義實現。這取決於你。