Я использую 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' }
}
}
В настоящее время я сохраняю идентификаторы сообществ, которым принадлежит документ, в виде массива строк.Пример: ["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
.
Так что мне нужно изменить свое отображение, мой фильтр илии то и другое?Поиск по документам для 6,6 , я вижу, что terms
требуется отображение non_analyzed
.
ОБНОВЛЕНИЕ --------------------------
Я обновил сопоставление сообществбыть keyword
как предложено ниже.Тем не менее, я все еще получил тот же результат.
Я обновил свой запрос следующим образом (используя идентификатор сообщества с документами):
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": []
}
}
}
]
}
}
Похоже, чтомой фильтр работает слишком хорошо?