как создать secondary index

В документации встречается понятие secondary index - но нигде не нашел как его создавать.

Вот, например есть plain таблица с текстовыми полями и полем multi

source eshop {
        type = mysql
        sql_host = mysql
        sql_user = root3
        sql_pass = root3
        sql_db = manticore_db
        sql_query_pre = SET NAMES utf8

        sql_query =  select id,name,description,categories, categories_int, price, type,brand,hierarchicalCategories,price_range,popularity,rating,objectID,categories2,catalog_desc from algolia_records
        sql_field_string = name
        sql_field_string = description
        sql_attr_multi=uint categories_int from field
        sql_attr_float = price
        sql_attr_string = type
        sql_attr_string = brand
        sql_attr_string = hierarchicalCategories
        sql_attr_string = price_range
        sql_attr_uint = popularity
        sql_attr_uint = rating
        sql_attr_string=objectID
        sql_attr_string=categories2
        sql_attr_json=catalog_desc
}

table eshop {
    type = plain
    path = /var/lib/manticore/eshop/eshop_plain
    source = eshop
    charset_table=russian, 0..9, english, _
    morphology=lemmatize_ru, lemmatize_en

    wordforms=/var/lib/manticore/wordforms/wordforms.txt
    index_exact_words=1
    min_prefix_len=2
    min_infix_len =2
    index_field_lengths=1
    bigram_index=all
    dict=keywords
}

когда пишешь sql_field_string - это значит что создается полнотекстовый индекс и ты можешь искать по индексу.

Что происходит с остальными полями?
Правильно я понимаю что для них индексы автоматически не создаются?

Попробовал посмотреть план выполнения запроса способом, указанным в документации - но он почему то ничего не показал.

set profiling=1;
select id from eshop where any(categories_int)=1;
show plan;
set profiling=0;

Я подозреваю что такой запрос выполнит full scan.
Кстати как правильно искать в multi полях? (так как я написал - или по другому?)
Как написать запрос если мне надо найти совпадение в multi поле вида:
any(categories_int)=1 or any(categories_int)=2 or any(categories_int)=3 …

Вопрос:
как создавать secondary index, которые позволят искать как по текстовому полю так и по содержимому полей- атрибутов по индексу полей атрибутов (не полным перебором)

secondary indexes сами сохраняются при индексации или сохранении disk chunk RT индекса или при мерже, те если при старте демона \ indexer есть вывод

Manticore XXX (columnar XXX) (secondary XXX)

то si генерятся - достаточно поставить MCL пакет.

Так же можно форсировать постройку si командой ALTER TABLE table_name REBUILD SECONDARY Rebuild-secondary-index

1 Like

используемые indexes показываются в выводе show meta

Вы так же можете использовать optimizer-hints чтобы форсировать использование index.

sql_field_string - значит что у вас индексируется и полнотекстовое поле и строковый атрибут и вы можете использовать и MATCH и фильтр

для categories_int я бы использовал select id from eshop where categories_int IN (1,2,3);

1 Like

Спасибо за ответ!

В случае plain таблицы что можно сделать ?
(у меня не RT таблицы)