Spring Data ElasticSearch 内置 IN 查询返回部分匹配

Spring Data ElasticSearch Build In IN query returning partial match

我是弹性搜索 spring 数据的新手,今天我试图在查询中使用 Spring 数据 ES 存储库。

我必须查找用户名列表,如果它在索引中完全匹配,则需要返回这些用户作为结果。

我尝试使用内置存储库 'In' 方法来这样做,但它 returns 部分匹配,请帮助我使它像 SQL IN 查询一样工作。

这是我的存储库代码:

public interface UserRepository extends ElasticsearchRepository<EsUser, String>
{
    public List<EsUser> findByUserAccountUserNameIn(Collection<String> terms);
}

请求:

{"terms":["vijay", "arun"], "type":"NAME"}

响应:

[
  {
    "userId": "236000",
    "fbId": "",
    "userAccount": {
      "userName": "arun",
      "urlFriendlyName": "arun",
    },
    "userProfile": {
    },
    "userStats": {
    }
  },
  {
    "userId": "6228",
    "userAccount": {
      "userName": "vijay",
      "urlFriendlyName": "vijay",
    },
    "userProfile": {
    },
    "userStats": {
    }
  },
  {
    "userId": "236000",
    "fbId": "",
    "userAccount": {
      "userName": "arun singh",
      "urlFriendlyName": "arun-singh",
    },
    "userProfile": {
    },
    "userStats": {
    }
  }
  {
    "userId": "236000",
    "fbId": "",
    "userAccount": {
      "userName": "vijay mohan",
      "urlFriendlyName": "vijay-mohan",
    },
    "userProfile": {
    },
    "userStats": {
    }
  }
 ]

这是因为您的 userAccount.userName 字段是经过分析的字符串,因此,arunsingh 这两个标记已被索引。然后您的查询匹配第一个标记,这是正常的。

为了防止这种情况发生并保证完全匹配,您需要将字段声明为 not_analyzed,如下所示:

@Field(index = FieldIndex.not_analyzed)
private String userName;

然后您需要在 /_template 中删除您的索引和关联模板,重新启动您的应用程序,以便使用正确的字段映射创建新模板和索引。

那么您的查询将起作用。