Spring Data ElasticSearch Build in IN查询返回部分匹配

时间:2016-05-06 00:09:20

标签: elasticsearch spring-data-elasticsearch

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

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

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

这是我的存储库代码:

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

REQUEST:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

然后您的查询将有效。