春季数据Elasticsearch | 通过仓库进行全文字段搜索

huangapple go评论96阅读模式
英文:

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(&quot;ID&quot;)
   @Id
   long _id;

   @Field(value = &quot;FULL_NAME&quot;, type = FieldType.Text)
   String fullName;
}

Repository is as:

@Repository
public interface PersonDataRepository extends ElasticsearchRepository&lt;Person, Long&gt; {

	//this does&#39;t work
	List&lt;Person&gt; findAllByFullNameIn(List&lt;String&gt; fullNames);

	//this works
	List&lt;Person&gt; 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:

{
   &quot;query&quot;:{
      &quot;bool&quot;:{
         &quot;must&quot;:[
            {
               &quot;bool&quot;:{
                  &quot;must&quot;:[
                     {
                        &quot;terms&quot;:{
                           &quot;FULL_NAME.keyword&quot;:[
                              &quot;ABC&quot;
                           ]
                        }
                     }
                  ]
               }
            }
         ]
      }
   },
   &quot;version&quot;:true
}

huangapple
  • 本文由 发表于 2020年9月7日 19:26:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/63776676.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定