英文:
Spring data Elasticsearch | Full text field search by repository
问题
以下是您要翻译的内容:
我根据 https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.repositories 中的说明,仅用于读取现有的索引数据,使用了 ElasticSearch 存储库。
我有一个经过分析的字段,假设为 fullName,为此我正在创建存储库中的搜索方法,如下所示:
Person.java
class Person{
@Field("ID")
@Id
long _id;
@Field(value = "FULL_NAME", type = FieldType.Text)
String fullName;
}
存储库如下:
@Repository
public interface PersonDataRepository extends ElasticsearchRepository<Person, Long> {
// 这个不起作用
List<Person> findAllByFullNameIn(List<String> fullNames);
// 这个可以工作
List<Person> findAllByFullName(String fullName);
}
由于该字段经过了分析,PersonDataRepository.findAllByFullNameIn(Stream.of("ABC").collect(Collectors.toList())) 不会产生任何结果,而 PersonDataRepository.findAllByFullName("ABC") 可以正常工作。
我发现这是由于经过分析的字符串字段造成的,如果我切换到关键字,它应该可以工作。
有人知道是否可以通过 Spring Data Elasticsearch 解决这个问题吗?
版本:
Spring Boot - 2.3.1.RELEASE
Spring Data Elasticsearch:4.0.1.RELEASE
Elasticsearch - 7.6.2
英文:
I am using Elastic search repository as per https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.repositories only to read an existing indexed data.
I have an analysed field let's say fullName, for which I am creating s search method in repository as follows:
Person.Java
class Person{
@Field("ID")
@Id
long _id;
@Field(value = "FULL_NAME", type = FieldType.Text)
String fullName;
}
Repository is as:
@Repository
public interface PersonDataRepository extends ElasticsearchRepository<Person, Long> {
//this does't work
List<Person> findAllByFullNameIn(List<String> fullNames);
//this works
List<Person> findAllByFullName(String fullName);
}
Since the field is analysed, PersonDataRepository.findAllByFullNameIn(Stream.of("ABC").collect(Colelctors.toList())) doesn't produce any results, while PersonDataRepository.findAllByFullName("ABC") works well.
I found out that this is due to the analysed String field and If I switch to keyword, it should work.
Anybody knows a way around this using Spring data elasticsearch?
Versions:
Springboot - 2.3.1.RELEASE
Spring Data Elasticsearch: 4.0.1.RELEASE
ElasticSearch - 7.6.2
答案1
得分: 1
这是一个错误,最近已经修复。它将包含在版本4.0.4和4.1.RC1中。
编辑: 这两个版本现在已经发布。
英文:
This was a bug and was recently fixed. It will be contained in versions 4.0.4 and 4.1.RC1
Edit: Both of these versions are released now
答案2
得分: 0
通过使用@Query注解编写手动查询来解决了这个问题。
使用关键字而不是完整名称传递了搜索查询,如下所示:
{
"query":{
"bool":{
"must":[
{
"bool":{
"must":[
{
"terms":{
"FULL_NAME.keyword":[
"ABC"
]
}
}
]
}
}
]
}
},
"version":true
}
英文:
Solved it by writing a manual query using @Query annotation.
Passed searchquery using keyword instead of complete name as:
{
"query":{
"bool":{
"must":[
{
"bool":{
"must":[
{
"terms":{
"FULL_NAME.keyword":[
"ABC"
]
}
}
]
}
}
]
}
},
"version":true
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论