elasticsearchoperations查询未返回完全匹配

7cjasjjr  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(320)

我正在为ElasticSearch中的一个查询而苦苦挣扎,所以我希望这里有人能帮我。
所以我在ElasticSearch中有一个索引,它存储用户的一些基本信息。然后我有了我的springbootapi,它允许客户机搜索上述索引。
在我的应用程序中,当用户注册时,他们可以在站点上选择一个显示名。现在,当他们键入一个显示名时,我希望能够检查elastic并告诉他们是否使用了它。
然而,我正在挣扎的地方是,假设我的索引中有一个用户的显示名为“johnboy”,现在有两个用户注册并希望显示名为“boy”。当我搜索“男孩”是否被带走时,我得到的是“约翰男孩”。我想要这样的查询告诉我,如果“男孩”是自由的,而不是关心如果“约翰男孩”是采取。
我以为我只是在想es,但也许不是,我的印象是字段(见下面的索引Map)关键字我可以做一个词搜索,并得到准确的匹配?
下面是我的pojo和es索引Map。如果有人能帮我,请……谢谢阅读:
搜索方法

public long checkUserNameAvailability(String query) {

        QueryBuilder matchSpecificFieldQuery= QueryBuilders
                .termQuery("displayName", query);

                Query searchQuery = new NativeSearchQueryBuilder()
                .withFilter(matchSpecificFieldQuery)
                .build();

        SearchHits<UserProfile> searchSuggestions =
                elasticsearchOperations.search(searchQuery,
                        UserProfile.class,
                        IndexCoordinates.of(elasticUserIndex));

        List<UserProfile> suggestions = new ArrayList<>();

        return searchSuggestions.getTotalHits();
    }

波乔

@Getter
@Setter
@Document(indexName = "userprofiles")
public class UserProfile {

    @Field(type = FieldType.Text, name = "userId")
    private String userId;

    @Field(type = FieldType.Keyword, name = "displayName")
    private String displayName;

    @Field(type = FieldType.Text, name = "name")
    private String name;

}

esMap

{
  "userprofiles": {
    "mappings": {
      "properties": {
        "displayName": {
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          },
          "type": "text"
        },
        "name": {
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          },
          "type": "text"
        },
        "userId": {
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          },
          "type": "text"
        }
      }
    }
  }
}

旁注:我使用的是springboot2.4.3版本

compile('org.springframework.boot:spring-boot-starter-data-elasticsearch')
    compile group: 'org.springframework.data', name: 'spring-data-elasticsearch', version: '4.1.5'

再次表示感谢

vuktfyat

vuktfyat1#

也许您应该使用关键字查询,因为'displayname'字段类型是文本,它将在查询和索引中都是分析器。

QueryBuilder matchSpecificFieldQuery= QueryBuilders
                .termQuery("displayName.keyword", query);
6yoyoihd

6yoyoihd2#

我认为你应该重新考虑你正在使用的查询类型。尝试在.keyword字段中使用简单匹配。

相关问题