当前位置: 首页 > 知识库问答 >
问题:

弹性搜索过滤器不适用于多值json

牛骞仕
2023-03-14
"userId": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "userId": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "userName": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "userId.userId": "testuser@demo.com"
        }}
   
      ]
    }
  }
}

共有1个答案

郭星文
2023-03-14

userid.userid字段是text类型。如果未定义分析器,elasticsearch默认使用标准分析器。这将把testuser@demo.com标记为

{
  "tokens": [
    {
      "token": "testuser",
      "start_offset": 0,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "demo.com",
      "start_offset": 9,
      "end_offset": 17,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

您需要在userid.userid字段上使用“userid.userid.keyword”字段。这使用关键字分析器而不是标准分析器(注意userid.userid字段后面的“.keyword”)。

您的点击数为0,因为术语查询总是搜索完全匹配的术语。当您使用标准分析器(默认的分析器)进行搜索时,您不会得到正确的结果

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "userId.userId.keyword": "testuser@demo.com"
          }
        }
      ]
    }
  }
}
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "userId.userId.keyword": [
              "testuser@demo.com",
              "abc.com"
            ]
          }
        }
      ]
    }
  }
}
{
  "query": {
    "bool": {
      "must_not": {
        "term": {
          "userId.userId.keyword": "testuser@demo.com"
        }
      }
    }
  }
}
 类似资料:
  • 这是回应的一部分 我有联系人号码和名字 现在我的第二个查询->我正在使用术语筛选器查询上面的联系电话

  • 我对Elasticsearch相当陌生,所以这是我的问题。我想用elasticsearch做一个搜索查询,想用多个术语过滤。 如果我想搜索用户'Tom',那么我希望获得用户'is active=1'、'is private=0'和'is owner=1'的所有匹配项。 这是我的搜索查询 谢谢你的帮助!!

  • 如何在elasticsearch中使用与聚合相关的过滤器? 官方文档只给出了过滤器和聚合的小例子,没有对查询dsl进行正式描述——例如,将其与postgres文档进行比较。 通过尝试,我发现以下查询被elasticsearch接受(没有解析错误),但忽略了给定的过滤器: 有些人建议使用查询而不是过滤。但官方文件通常建议对精确值进行过滤。查询的另一个问题是:虽然过滤器提供了和,但查询不提供。 有人能

  • 我正在尝试在Elastic 2中创建一个过滤索引别名。十、 以下是所有青少年的资料,不分性别。我只想在这个过滤器里看到雌性。 这就是我试图创建索引别名的原因: 我看了这个问题,似乎是相同的答案,但是我的JSON一定有问题。 Elasticsearch将范围和术语连接到相同的数组项

  • 我有一个关于书籍的数据集,每本书都可以是一种或多种语言的。每个用户都注册为拥有一种或多种语言。 当用户搜索书籍时,我只想返回那些他们理解所有语言的书籍。 例如,系统中有以下两本书: 如果John被注册为懂英语、德语、法语和意大利语,那么他的查询结果永远不应该包括Book B。 我的系统目前是使用Apache Solr编写的,最后我编写了一个插件来执行子集操作(如果记录的语言是用户语言的子集,则该记

  • 在Udemy教程中,我在这里遇到了这个查询: 我想知道是否有可能优化它?我在想两种可能的方法: > 将“流派”放入筛选器上下文中。但是一部电影可能有多种类型,所以我不确定使用type关键字和filter-term是否能在那里工作。 直接将“must_not”放在过滤器上下文中(没有bool)是行不通的,因为据我所知,过滤器不允许“过滤掉”,只允许“过滤保留什么”。但是如果我将must_not包装在