我正在使用ElasticSearch搜索文档。但是,我需要确保当前用户能够看到这些文档。每个文档都与用户可能所属的社区相关联。
这是我的文档的映射:
export const mapping = {
properties: {
amazonId: { type: 'text' },
title: { type: 'text' },
subtitle: { type: 'text' },
description: { type: 'text' },
createdAt: { type: 'date' },
updatedAt: { type: 'date' },
published: { type: 'boolean' },
communities: { type: 'nested' }
}
}
我目前正在将文档所属社区的ID保存在字符串数组中。例如:["edd05cd0-0a49-4676-86f4-2db913235371", "672916cf-ee32-4bed-a60f-9a7c08dba04b"]
当前,当我使用{term: { communities: community.id } }
过滤查询时,它会返回所有文档,而与绑定的社区无关。
这是完整的查询:
{
index: 'document',
filter_path: { filter: {term: { communities: community.id } } },
body: {
sort: [{ createdAt: { order: 'asc' } }]
}
}
这是基于社区"b7d28e7f-7534-406a-981e-ddf147b5015a"
的以下结果。 注意:这是我的graphql的返回结果,因此,在解决了ES查询的匹配后,文档上的社区是实际的完整对象。
"hits": [
{
"title": "The One True Document",
"communities": [
{
"id": "edd05cd0-0a49-4676-86f4-2db913235371"
},
{
"id": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
}
]
},
{
"title": "Boring Document 1",
"communities": []
},
{
"title": "Boring Document 2",
"communities": []
},
{
"title": "Unpublished",
"communities": [
{
"id": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
}
]
}
]
当我尝试将社区映射为{type: 'keyword', index: 'not_analyzed'}
时,收到一条错误消息,指出[illegal_argument_exception] Could not convert [communities.index] to boolean
。
那么我需要更改映射,过滤器还是同时更改两者?在docs for 6.6周围搜索,我发现terms
需要non_analyzed
映射。
更新--------------------------
我将社区映射更新为keyword
,如下所示。但是,我仍然收到相同的结果。
我将查询更新为以下内容(使用包含文档的社区ID)
query: { index: 'document',
body:
{ sort: [ { createdAt: { order: 'asc' } } ],
from: 0,
size: 5,
query:
{ bool:
{ filter:
{ term: { communities: '672916cf-ee32-4bed-a60f-9a7c08dba04b' } } } } } }
哪个给我以下结果:
{
"data": {
"communities": [
{
"id": "672916cf-ee32-4bed-a60f-9a7c08dba04b",
"feed": {
"documents": {
"hits": []
}
}
}
]
}
}
似乎我的过滤器工作得很好?
答案 0 :(得分:1)
由于您存储的是社区ID,因此应确保不对ID进行分析。为此,communities
的类型应为keyword
。其次,您要存储社区ID的数组,因为一个用户可以属于多个社区。为此,您不必使其类型为nested
。 Nested共有不同的用例。
要将值作为数组使用,请确保在索引时始终将值作为数组传递给字段,即使该值是单个值。
您需要更改映射以及针对字段communities
索引值的方式。
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"amazonId": {
"type": "text"
},
"title": {
"type": "text"
},
"subtitle": {
"type": "text"
},
"description": {
"type": "text"
},
"createdAt": {
"type": "date"
},
"updatedAt": {
"type": "date"
},
"published": {
"type": "boolean"
},
"communities": {
"type": "keyword"
}
}
}
}
}
2。将文档添加到索引:
PUT my_index/_doc/1
{
"title": "The One True Document",
"communities": [
"edd05cd0-0a49-4676-86f4-2db913235371",
"672916cf-ee32-4bed-a60f-9a7c08dba04b"
]
}
3。按社区ID过滤:
GET my_index/_doc/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"communities": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
}
}
]
}
}
}
PUT my_index_2
{
"mappings": {
"_doc": {
"properties": {
"amazonId": {
"type": "text"
},
"title": {
"type": "text"
},
"subtitle": {
"type": "text"
},
"description": {
"type": "text"
},
"createdAt": {
"type": "date"
},
"updatedAt": {
"type": "date"
},
"published": {
"type": "boolean"
},
"communities": {
"type": "nested"
}
}
}
}
}
2。索引文件:
PUT my_index_2/_doc/1
{
"title": "The One True Document",
"communities": [
{
"id": "edd05cd0-0a49-4676-86f4-2db913235371"
},
{
"id": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
}
]
}
3。查询(用于嵌套查询):
GET my_index_2/_doc/_search
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "communities",
"query": {
"term": {
"communities.id.keyword": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
}
}
}
}
]
}
}
}
您可能会注意到我使用的是communities.id.keyword
,而不是communities.id
。要了解其原因,请遍历this。