Ну, безусловно, вы можете сделать это, да. Будет ли это эффективно, в зависимости от вашей стратегии, да. Это быстро, это супер быстро.
Вы можете решить использовать один индекс для каждой роли и индексировать только тот контент, который разрешено просматривать пользователю / роли. Затем вы запросите этот индекс в соответствии с ролью вашего пользователя.
Вы можете решить использовать только один индекс с несколькими полями. Вы можете иметь поле для каждой роли и индексировать содержимое соответственно. Не беспокойтесь о дублировании контента. Как и выше, вы решаете, какое поле запрашивать во время запроса, в соответствии с вашими ролями пользователя
Вы можете хранить все свои html-материалы в одном отдельном поле, убирать все html-теги и настраивать анализатор полей, чтобы оставить только некоторые конкретные теги, которые впоследствии можно будет проанализировать как фильтр, чтобы решить, отображать или нет документ в результаты.
В общем, вам нужно только удалить html-тег с помощью html strip char filter в индексное время. Размер поля не имеет значения. Вы можете вставить туда целую страницу без разницы с точки зрения производительности.
Elasticsearch очень гибкий. Вы можете делать все, что угодно. Это потрясающая технология, на которую стоит потратить время.
Вот пример сопоставления для вас:
{
"settings":{
"max_ngram_diff":25,
"number_of_shards":1,
"number_of_replicas":2,
"analysis":{
"normalizer":{
"case_insensitive":{
"filter":"lowercase"
}
},
"tokenizer":{
"word_char_include_slash":{
"type":"simple_pattern",
"pattern":"[\\w\\/]+"
}
},
"char_filter":{
"escaped_tags_h1":{
"type":"html_strip",
"escaped_tags":[
"h1"
]
}
},
"filter":{
"ngram_filter":{
"type":"ngram",
"min_gram":1,
"max_gram":10
}
},
"analyzer":{
"stripped":{
"type":"custom",
"tokenizer":"whitespace",
"filter":[
"lowercase",
"asciifolding",
"ngram_filter"
],
"char_filter":[
"escaped_tags_h1"
]
}
}
}
},
"mappings":{
"properties":{
"meta-description":{
"type":"text"
},
"meta-title":{
"type":"text"
},
"title":{
"type":"text"
},
"url":{
"type":"text"
},
"content-visitor":{
"type":"text",
"analyzer":"stripped"
},
"content-admin":{
"type":"text",
"analyzer":"stripped"
},
"content-editor":{
"type":"text",
"analyzer":"stripped"
},
"created_at":{
"type":"date",
"format":"date_time"
}
}
}
}
Это очень просто, но вы поймете идею. Сначала определите, какая часть страницы вы хотите сохранить, какая-то общая, какая-то конкретная ... Дайте мне знать, если это поможет. Это немного сложный вопрос, чтобы ответить на белые знания о вашей стратегии / способности сканирования.