为什么我的 ElasticSearch 查询返回零文档?
Why is my ElasticSeach query returning zero document?
我正在尝试从 Lambda worker 查询 AWS ElasticSearch 域。
为此,我使用 http-aws-es 和 Elastic Search 的主要 javascript 客户端。
我查询具有以下相关字段的文档:
- 一个
ref
字段 - 字符串
- A
status
字段 - 字符串 ENUM (REMOVED
, BLOCKED
, PUBLISHED
, PENDING
, VERIFIED
)
- 一个
field
字段 - 字符串数组
- 一个
thematics
字段 - 字符串数组
我要实现的是:
- 过滤所有不是
PUBLISHED
或 VERIFIED
或设置 ref
字段的文档
- Return 与我的
keywwords
参数(字符串数组)相对于 field
和 thematics
中的值最匹配
- 将状态为
PUBLISHED
的文档排在最前面
- 将结果数限制为 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类型):
- 城市文本(字符串)
- contact_email 文本(字符串)
- contact_entity 文本(字符串)
- contact_firstname 文本(字符串)
- contact_lastname 文本(字符串)
- 联系人文本(字符串列表)
- 国家/地区文本(字符串)
- 创建日期(字符串)
- 描述文本(字符串)
- 编辑键文本(字符串)
- 字段文本(字符串)
- id 文本(字符串)
- 名称文本(字符串)
- pubId 文本(字符串)
- ref 文本(字符串)
- 状态文本(字符串)
- 状态文本(字符串)
- 主题文本(字符串数组)
- 键入文本(字符串数组)
- 更新时间(字符串)
- url 文本(字符串)
- verifyKey 文本(字符串)
- 区域文本(字符串数组)
取自 AWS 弹性搜索管理控制台(索引选项卡 > 映射)
您的查询中存在一两个问题(should
inside must
和 must_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'
}
}
]
}
}
}
我正在尝试从 Lambda worker 查询 AWS ElasticSearch 域。
为此,我使用 http-aws-es 和 Elastic Search 的主要 javascript 客户端。
我查询具有以下相关字段的文档:
- 一个
ref
字段 - 字符串 - A
status
字段 - 字符串 ENUM (REMOVED
,BLOCKED
,PUBLISHED
,PENDING
,VERIFIED
) - 一个
field
字段 - 字符串数组 - 一个
thematics
字段 - 字符串数组
我要实现的是:
- 过滤所有不是
PUBLISHED
或VERIFIED
或设置ref
字段的文档 - Return 与我的
keywwords
参数(字符串数组)相对于field
和thematics
中的值最匹配
- 将状态为
PUBLISHED
的文档排在最前面 - 将结果数限制为 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类型):
- 城市文本(字符串)
- contact_email 文本(字符串)
- contact_entity 文本(字符串)
- contact_firstname 文本(字符串)
- contact_lastname 文本(字符串)
- 联系人文本(字符串列表)
- 国家/地区文本(字符串)
- 创建日期(字符串)
- 描述文本(字符串)
- 编辑键文本(字符串)
- 字段文本(字符串)
- id 文本(字符串)
- 名称文本(字符串)
- pubId 文本(字符串)
- ref 文本(字符串)
- 状态文本(字符串)
- 状态文本(字符串)
- 主题文本(字符串数组)
- 键入文本(字符串数组)
- 更新时间(字符串)
- url 文本(字符串)
- verifyKey 文本(字符串)
- 区域文本(字符串数组)
取自 AWS 弹性搜索管理控制台(索引选项卡 > 映射)
您的查询中存在一两个问题(should
inside must
和 must_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'
}
}
]
}
}
}