Индексирование поля значений через запятую в 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] "}

Другие вопросы по тегам