Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ElasticsearchOperations查询未返回精确匹配_Java_Spring_Spring Boot_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Spring Data - Fatal编程技术网 elasticsearch,spring-data,Java,Spring,Spring Boot,elasticsearch,Spring Data" /> elasticsearch,spring-data,Java,Spring,Spring Boot,elasticsearch,Spring Data" />

Java ElasticsearchOperations查询未返回精确匹配

Java ElasticsearchOperations查询未返回精确匹配,java,spring,spring-boot,elasticsearch,spring-data,Java,Spring,Spring Boot,elasticsearch,Spring Data,我在弹性搜索中遇到了一个问题,所以我希望这里有人能帮我 所以我在弹性搜索中有一个索引,它存储用户的一些基本信息。然后我有了我的SpringBootAPI,它允许客户端在所述索引上搜索 在我的应用程序中,当用户注册时,他们可以在站点上选择显示名称。现在,当他们键入一个显示名称时,我希望能够检查elastic,并告诉他们是否使用了它 然而,我所挣扎的是,假设我的索引中有一个用户的显示名为“John Boy”,现在有两个用户注册并想要显示名为“Boy”。当我搜索“男孩”是否被带走时,我得到了“约翰男孩

我在弹性搜索中遇到了一个问题,所以我希望这里有人能帮我

所以我在弹性搜索中有一个索引,它存储用户的一些基本信息。然后我有了我的SpringBootAPI,它允许客户端在所述索引上搜索

在我的应用程序中,当用户注册时,他们可以在站点上选择显示名称。现在,当他们键入一个显示名称时,我希望能够检查elastic,并告诉他们是否使用了它

然而,我所挣扎的是,假设我的索引中有一个用户的显示名为“John Boy”,现在有两个用户注册并想要显示名为“Boy”。当我搜索“男孩”是否被带走时,我得到了“约翰男孩”。我想要它,所以查询告诉我“男孩”是否自由,而不关心“约翰男孩”是否被带走

我以为我只是想了解一下ES,但也许不是,我的印象是字段(见下面的索引映射)关键字我可以做一个术语搜索并得到精确的匹配

下面我介绍了我的Pojo和ES索引映射。如果有人能帮助我,请……谢谢阅读:

搜索方法

  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();
    }
ES映射

{
  "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"
        }
      }
    }
  }
}

旁注: 我使用的是Spring boot版本2.4.3


再次非常感谢

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

也许您应该使用keyword查询,因为“displayName”字段类型是文本,它将在查询和索引中都是analyzer

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

您好,很有趣,也许用查询代替术语查询可能会很有帮助,谢谢!有没有办法使术语查询不区分大小写?好的,我重新创建了我的索引来设置“normalizer”:“不区分大小写的normalizer”,然后执行匹配查询,现在它可以正常工作了。太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了太感谢你了
    compile('org.springframework.boot:spring-boot-starter-data-elasticsearch')
    compile group: 'org.springframework.data', name: 'spring-data-elasticsearch', version: '4.1.5'
QueryBuilder matchSpecificFieldQuery= QueryBuilders
                .termQuery("displayName.keyword", query);