【问题标题】:Spring Data ElasticSearch Build In IN query returning partial matchSpring Data ElasticSearch Build In IN 查询返回部分匹配
【发布时间】:2016-05-06 00:09:19
【问题描述】:

我是弹性搜索弹簧数据的新手,今天我试图让 In query 与 Spring 数据 ES 存储库一起工作。

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

我尝试使用内置存储库“In”方法来执行此操作,但它返回部分匹配项,请帮助我使其像 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": {
    }
  }
 ]

【问题讨论】:

  • 您需要执行过滤而不是查询

标签: elasticsearch spring-data-elasticsearch


【解决方案1】:

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

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

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

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

那么您的查询将起作用。

【讨论】:

    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多