【问题标题】:Query Elastic DSL - Search query using spring boot dataQuery Elastic DSL - 使用 Spring Boot 数据进行搜索查询
【发布时间】:2021-02-05 13:35:52
【问题描述】:

我有以下通过 Java 和 spring boot 数据 elasticsearch 生成的属性文件。该文件在 User.java 类中生成,属性“friends”是一个 List,其中 Friends 是一个 Fiends.java 文件,两个类文件都充当模型。本质上,我想生成一个选择语句,但使用 Spring Boot Data 查询 DSL 语言。该索引称为用户。

所以我试图实现以下 SELECT * FROM User where (userName ="Tom" ORnickname="Tom" OR friendsNickname="Tom") AND userID="3793"

或(详细-dsl)

匹配 where (userName="Tom" ORnickname="Tom" OR friendsNickname="Tom") AND userID="3793"

"mappings": {
  "properties": {
    "_class": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    },
    "userName": {
      "type": "text"
    },
    "userId": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    },
    "friends": {
      "type": "nested",
      "properties": {
        "firstName": {
          "type": "text"
        },
        "lastName": {
          "type": "text"
        },
        "age": {
          "type": "text"
        },
        "friendsNickname": {
          "type": "text"
        }
      }
    },
    "nickname": {
      "type": "text"
    }
  }
}

我尝试了以下代码,但从弹性搜索返回 0 次命中,但没有骰子返回没有命中

BoolQueryBuilder query =
        QueryBuilders.boolQuery()
            .must(
                QueryBuilders.boolQuery()
                    .should(QueryBuilders.matchQuery("userName", "Tom"))
                    .should(QueryBuilders.matchQuery("nickname", "Tom"))
                    .should(
                        QueryBuilders.nestedQuery(
                            "friends",
                            QueryBuilders.matchQuery("friendsNickname", "Tom"),
                            ScoreMode.None)))
            .must(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("userID", "3793")));

抱歉,如果这似乎是一个简单的问题,我对 ES 的了解很薄,如果这看起来是一个显而易见的答案,对不起。

【问题讨论】:

    标签: java spring-boot elasticsearch


    【解决方案1】:

    伟大的开始!!

    您只是在以下行中出现了一个小错误,您需要在字段名称前加上嵌套字段名称的前缀,即friends.friendsNickname

    ...
    QueryBuilders.matchQuery("friends.friendsNickname", "Tom"),
    ...                          ^
                                 |
                              prefix
    

    您还有另一个错字,根据您的映射,userID 应为 userId。

    【讨论】:

      【解决方案2】:

      在 userId.keyword 上使用 friends.friendsNickname 和用户 termsQuery

      `

      .must(QueryBuilders.boolQuery()
          .should(QueryBuilders.matchQuery("userName", "Tom"))
          .should(QueryBuilders.matchQuery("nickname", "Tom"))
          .should(QueryBuilders.matchQuery("friends.friendsNickname", "Tom"))
        )
        .must(QueryBuilders.termsQuery("userId.keyword", "3793"));
      

      `

      虽然我建议将用户名、用户 ID 更改为关键字。

      "userId": {
            "type": "keyword",
            "ignore_above": 256,
            "fields": {
              "text": {
                "type": "text"
              }
            }
          }
      

      那么您不必输入关键字,因此您只需输入 userId 而不是 userId.keyword。如果要在字段上进行全文搜索,请使用 userId.text。使用文本类型的缺点是您不能使用该字段对结果进行排序,这就是我鼓励 ID 字段为关键字类型的原因。

      【讨论】:

        猜你喜欢
        • 2015-08-30
        • 2023-01-02
        • 1970-01-01
        • 2022-12-20
        • 2021-08-27
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        • 2016-05-01
        相关资源
        最近更新 更多