为什么我的 ElasticSearch 查询返回零文档?

Why is my ElasticSeach query returning zero document?

我正在尝试从 Lambda worker 查询 AWS ElasticSearch 域。

为此,我使用 http-aws-es 和 Elastic Search 的主要 javascript 客户端。

我查询具有以下相关字段的文档:

我要实现的是:

  1. 过滤所有不是 PUBLISHEDVERIFIED 或设置 ref 字段的文档
  2. Return 与我的 keywwords 参数(字符串数组)相对于 fieldthematics
  3. 中的值最匹配
  4. 将状态为 PUBLISHED 的文档排在最前面
  5. 将结果数限制为 20

我找到了 more_like_this 运算符,并尝试了一下。我逐步构建我的查询和实际版本,至少 return 没有错误,但没有文档被 return 编辑。它仍然错过了上面的 ref 过滤器 + #3 和 #4。这是查询:

  const client = new elasticsearch.Client({
      host: ELASTICSEARCH_DOMAIN,
      connectionClass: httpAwsEs,
      amazonES: {
        region: AWS_REGION,
        credentials: new AWS.EnvironmentCredentials('AWS')
      }
    })
    let keywords = event.arguments.keywords
    let rst = await client.search({
      body: {
        'query': {
          'bool': {
            'filter': {
              'bool': {
                'must_not': [
                  {
                    'term': {
                      'status': 'REMOVED'
                    }
                  },
                  {
                    'term': {
                      'status': 'PENDING'
                    }
                  },
                  {
                    'term': {
                      'status': 'BLOCKED'
                    }
                  }
                ]
              }
            },
            'must': {
              'more_like_this': {
                'fields': ['field', 'thematics'],
                'like': keywords,
                'min_term_freq': 1,
                'max_query_terms': 2
              },
              'should': [
                {
                  'term': {
                    'status': 'PUBLISHED'
                  }
                }
              ]
            }
          }
        }
      }

    })
    console.log(rst)
    return rst

我必须上传我的 lambda 代码来调试它,这使调试变得非常复杂。因为我以前从未进行过 ES 查询,所以我想至少获得一些关于如何进行此操作的提示,或者知道我是否误用了 ES 查询语法。


编辑:

应要求,这是我的索引映射(JS类型):

取自 AWS 弹性搜索管理控制台(索引选项卡 > 映射)

您的查询中存在一两个问题(should inside mustmust_not inside filter)。试试下面的简化查询:

{
  'query': {
    'bool': {
      'must_not': [
        {
          'term': {
            'status.keyword': 'REMOVED'
          }
        },
        {
          'term': {
            'status.keyword': 'PENDING'
          }
        },
        {
          'term': {
            'status.keyword': 'BLOCKED'
          }
        }
      ],
      'must': [
        {
          'more_like_this': {
            'fields': [
              'field',
              'thematics'
            ],
            'like': keywords,
            'min_term_freq': 1,
            'max_query_terms': 2
          }
        }
      ],
      'should': [
        {
          'term': {
            'status.keyword': 'PUBLISHED'
          }
        }
      ]
    }
  }
}