Индексирование поля значений через запятую в Elastic Search
Я использую Nutch для сканирования сайта и индексации его в поиске Elastic. На моем сайте есть метатеги, некоторые из которых содержат разделенный запятыми список идентификаторов (которые я собираюсь использовать для поиска). Например:
contentTypeIds = "2,5,15". (примечание: без квадратных скобок).
Когда ES индексирует это, я не могу найти contentTypeIds:5 и найти документы, чьи contentTypeIds содержат 5; этот запрос возвращает только те документы, у которых contentTypeIds равен "5". Тем не менее, я хочу найти документы, чьи contentTypeIds содержат 5.
В Solr это решается путем установки для поля contentTypeIds значения multiValued="true" в schema.xml. Я не могу найти, как сделать что-то подобное в ES.
Я новичок в ES, поэтому я, наверное, что-то пропустил. Спасибо за вашу помощь!
2 ответа
Создайте собственный анализатор, который будет разбивать индексированный текст на токены запятыми.
Тогда вы можете попытаться найти. Если вас не интересует актуальность, вы можете использовать фильтр для поиска в ваших документах. Мой пример показывает, как вы можете попытаться выполнить поиск с помощью фильтра терминов.
Ниже вы можете найти, как это сделать с помощью плагинов смысла.
DELETE testindex
PUT testindex
{
"index" : {
"analysis" : {
"tokenizer" : {
"comma" : {
"type" : "pattern",
"pattern" : ","
}
},
"analyzer" : {
"comma" : {
"type" : "custom",
"tokenizer" : "comma"
}
}
}
}
}
PUT /testindex/_mapping/yourtype
{
"properties" : {
"contentType" : {
"type" : "string",
"analyzer" : "comma"
}
}
}
PUT /testindex/yourtype/1
{
"contentType" : "1,2,3"
}
PUT /testindex/yourtype/2
{
"contentType" : "3,4"
}
PUT /testindex/yourtype/3
{
"contentType" : "1,6"
}
GET /testindex/_search
{
"query": {"match_all": {}}
}
GET /testindex/_search
{
"filter": {
"term": {
"contentType": "6"
}
}
}
Надеюсь, поможет.
{"tokenizer": {"type": "char_group","tokenize_on_chars": ["whitespace", ",", "\ n"]},"text": " , [email protected][email protected] "}