Морфологические препроцессоры могут применяться к словам во время индексирования для нормализации различных форм одного слова и улучшения сегментации. Например, английский стеммер может нормализовать "dogs" и "dog" к "dog", что приводит к идентичным результатам поиска для обоих ключевых слов.
Manticore имеет четыре встроенных морфологических препроцессора:
- Лемматизатор: сводит слово к его корню или лемме. Например, "running" может быть сведено к "run", а "octopi" — к "octopus". Обратите внимание, что некоторые слова могут иметь несколько соответствующих корневых форм. Например, "dove" может быть либо прошедшим временем от "dive", либо существительным, означающим птицу, как в "A white dove flew over the cuckoo's nest." В этом случае лемматизатор может сгенерировать все возможные корневые формы.
- Стеммер: сводит слово к его основе, удаляя или заменяя определенные известные суффиксы. Полученная основа не обязательно может быть допустимым словом. Например, английский стеммер Портера сводит "running" к "run", "business" к "busi" (недопустимое слово) и вообще не сводит "octopi".
- Фонетические алгоритмы: заменяют слова фонетическими кодами, которые одинаковы, даже если слова разные, но фонетически близки.
- Алгоритмы разбиения на слова: разделяют текст на слова. В настоящее время доступны только для китайского языка.
morphology = morphology1[, morphology2, ...]
Директива morphology задает список морфологических препроцессоров, применяемых к индексируемым словам. Это необязательная настройка, по умолчанию препроцессор не применяется.
Manticore включает встроенные морфологические препроцессоры для:
- Лемматизаторов английского, русского и немецкого языков
- Стеммеров английского, русского, арабского и чешского языков
- Фонетических алгоритмов SoundEx и MetaPhone
- Алгоритма разбиения на слова для китайского языка
- Стеммеров Snowball (libstemmer) для более чем 15 других языков также доступны.
Лемматизаторы требуют файлы словарей .pak, которые можно установить с помощью пакетов manticore-language-packs или скачать с сайта Manticore. В последнем случае словари необходимо поместить в каталог, указанный в lemmatizer_base.
Дополнительно, настройка lemmatizer_cache может использоваться для ускорения лемматизации за счет использования большего объема ОЗУ для кэша несжатого словаря.
Сегментация китайского языка может выполняться с использованием ICU или Jieba (требует пакет manticore-language-packs). Обе библиотеки обеспечивают более точную сегментацию, чем n-граммы, но работают немного медленнее. charset_table должна включать все китайские иероглифы, что можно сделать с помощью наборов символов cont, cjk или chinese. Когда вы устанавливаете morphology=icu_chinese или morphology=jieba_chinese, документы сначала обрабатываются ICU или Jieba. Затем токенизатор обрабатывает результат в соответствии с charset_table, и, наконец, применяются другие морфологические процессоры из опции morphology. Только те части текста, которые содержат китайский язык, передаются в ICU/Jieba для сегментации, в то время как другие части могут быть изменены другими средствами, такими как различные морфологии или charset_table.
Встроенные английский и русский стеммеры работают быстрее, чем их аналоги в libstemmer, но могут давать несколько иные результаты.
Реализация Soundex соответствует реализации в MySQL. Реализация Metaphone основана на алгоритме Double Metaphone и индексирует первичный код.
Чтобы использовать опцию morphology, укажите один или несколько встроенных вариантов, включая:
- none: не выполнять никакой морфологической обработки
- lemmatize_ru - применить русский лемматизатор и выбрать одну корневую форму
- lemmatize_uk - применить украинский лемматизатор и выбрать одну корневую форму
- lemmatize_en - применить английский лемматизатор и выбрать одну корневую форму
- lemmatize_de - применить немецкий лемматизатор и выбрать одну корневую форму
- lemmatize_ru_all - применить русский лемматизатор и индексировать все возможные корневые формы
- lemmatize_uk_all - применить украинский лемматизатор и индексировать все возможные корневые формы
- lemmatize_en_all - применить английский лемматизатор и индексировать все возможные корневые формы
- lemmatize_de_all - применить немецкий лемматизатор и индексировать все возможные корневые формы
- stem_en - применить английский стеммер Портера
- stem_ru - применить русский стеммер Портера
- stem_enru - применить английский и русский стеммеры Портера
- stem_cz - применить чешский стеммер
- stem_ar - применить арабский стеммер
- soundex - заменить ключевые слова их кодом SOUNDEX
- metaphone - заменить ключевые слова их кодом METAPHONE
- icu_chinese - применить сегментацию китайского текста с использованием ICU
- jieba_chinese - применить сегментацию китайского текста с использованием Jieba (требует пакет
manticore-language-packs) - libstemmer_* . Подробности смотрите в списке поддерживаемых языков
Можно указать несколько стеммеров, разделенных запятыми. Они будут применяться к входящим словам в указанном порядке, и обработка остановится, как только один из стеммеров изменит слово. Кроме того, когда включена функция wordforms, слово сначала ищется в словаре словоформ. Если в словаре есть соответствующая запись, стеммеры вообще не применяются. wordforms можно использовать для реализации исключений стемминга.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) morphology = 'stem_en, libstemmer_sv'POST /cli -d "CREATE TABLE products(title text, price float) morphology = 'stem_en, libstemmer_sv'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'morphology' => 'stem_en, libstemmer_sv'
]);utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'stem_en, libstemmer_sv\'')await utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'stem_en, libstemmer_sv\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'stem_en, libstemmer_sv\'');utilsApi.sql("CREATE TABLE products(title text, price float) morphology = 'stem_en, libstemmer_sv'", true);utilsApi.Sql("CREATE TABLE products(title text, price float) morphology = 'stem_en, libstemmer_sv'", true);utils_api.sql("CREATE TABLE products(title text, price float) morphology = 'stem_en, libstemmer_sv'", Some(true)).await;table products {
morphology = stem_en, libstemmer_sv
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}morphology_skip_fields = field1[, field2, ...]
Список полей, для которых пропускается морфологическая предобработка. Необязательный параметр, по умолчанию пустой (применять предобработчики ко всем полям).
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, name text, price float) morphology_skip_fields = 'name' morphology = 'stem_en'POST /cli -d "
CREATE TABLE products(title text, name text, price float) morphology_skip_fields = 'name' morphology = 'stem_en'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'morphology_skip_fields' => 'name',
'morphology' => 'stem_en'
]);utilsApi.sql('CREATE TABLE products(title text, price float) morphology_skip_fields = \'name\' morphology = \'stem_en\'')await utilsApi.sql('CREATE TABLE products(title text, price float) morphology_skip_fields = \'name\' morphology = \'stem_en\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) morphology_skip_fields = \'name\' morphology = \'stem_en\'');utilsApi.sql("CREATE TABLE products(title text, price float) morphology_skip_fields = 'name' morphology = 'stem_en'", true);utilsApi.Sql("CREATE TABLE products(title text, price float) morphology_skip_fields = 'name' morphology = 'stem_en'", true);utils_api.sql("CREATE TABLE products(title text, price float) morphology_skip_fields = 'name' morphology = 'stem_en'", Some(true)).await;table products {
morphology_skip_fields = name
morphology = stem_en
type = rt
path = tbl
rt_field = title
rt_field = name
rt_attr_uint = price
}min_stemming_len = length
Минимальная длина слова, при которой включается стемминг. Необязательный параметр, по умолчанию равен 1 (стемминг для всех слов).
Стеммеры не идеальны и иногда могут давать нежелательные результаты. Например, пропуск ключевого слова "gps" через стеммер Портера для английского языка даёт "gp", что не совсем соответствует цели. Функция min_stemming_len позволяет отключать стемминг в зависимости от длины исходного слова, т.е. избегать стемминга слишком коротких слов. Ключевые слова, которые короче заданного порога, стеммингу подвергаться не будут. Обратите внимание, что ключевые слова, длина которых в точности равна указанной, будут проходить стемминг. Таким образом, чтобы избежать стемминга для 3-символьных ключевых слов, следует указать значение 4. Для более тонкого контроля используйте функцию wordforms.
- SQL
- JSON
- PHP
- Python
- Python-asycnio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) min_stemming_len = '4' morphology = 'stem_en'POST /cli -d "
CREATE TABLE products(title text, price float) min_stemming_len = '4' morphology = 'stem_en'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'min_stemming_len' => '4',
'morphology' => 'stem_en'
]);utilsApi.sql('CREATE TABLE products(title text, price float) min_stemming_len = \'4\' morphology = \'stem_en\'')await utilsApi.sql('CREATE TABLE products(title text, price float) min_stemming_len = \'4\' morphology = \'stem_en\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) min_stemming_len = \'4\' morphology = \'stem_en\'');utilsApi.sql("CREATE TABLE products(title text, price float) min_stemming_len = '4' morphology = 'stem_en'", true);utilsApi.Sql("CREATE TABLE products(title text, price float) min_stemming_len = '4' morphology = 'stem_en'", true);utils_api.sql("CREATE TABLE products(title text, price float) min_stemming_len = '4' morphology = 'stem_en'", Some(true)).await;table products {
min_stemming_len = 4
morphology = stem_en
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}index_exact_words = {0|1}
Эта опция позволяет индексировать исходные ключевые слова вместе с их морфологически изменёнными версиями. Однако исходные ключевые слова, переопределённые с помощью wordforms и exceptions, не могут быть проиндексированы. Значение по умолчанию — 0, что означает, что функция отключена по умолчанию.
Это позволяет использовать оператор точной формы в языке запросов. Включение этой функции увеличит размер полнотекстового индекса и время индексации, но не повлияет на производительность поиска.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) index_exact_words = '1' morphology = 'stem_en'POST /cli -d "
CREATE TABLE products(title text, price float) index_exact_words = '1' morphology = 'stem_en'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'index_exact_words' => '1',
'morphology' => 'stem_en'
]);utilsApi.sql('CREATE TABLE products(title text, price float) index_exact_words = \'1\' morphology = \'stem_en\'')await utilsApi.sql('CREATE TABLE products(title text, price float) index_exact_words = \'1\' morphology = \'stem_en\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) index_exact_words = \'1\' morphology = \'stem_en\'');utilsApi.sql("CREATE TABLE products(title text, price float) index_exact_words = '1' morphology = 'stem_en'", true);utilsApi.Sql("CREATE TABLE products(title text, price float) index_exact_words = '1' morphology = 'stem_en'", true);utils_api.sql("CREATE TABLE products(title text, price float) index_exact_words = '1' morphology = 'stem_en'", Some(true)).await;table products {
index_exact_words = 1
morphology = stem_en
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}jieba_hmm = {0|1}
Включить или отключить HMM в инструменте сегментации Jieba. Необязательный параметр; по умолчанию равен 1.
В Jieba опция HMM (Hidden Markov Model, скрытая марковская модель) относится к алгоритму, используемому для сегментации слов. В частности, она позволяет Jieba выполнять китайскую сегментацию слов, распознавая неизвестные слова, особенно те, которых нет в её словаре.
Jieba в основном использует словарный метод для сегментации известных слов, но когда опция HMM включена, она применяет статистическую модель для определения вероятных границ слов для слов или фраз, отсутствующих в её словаре. Это особенно полезно для сегментации новых или редких слов, имён и сленга.
Вкратце, опция jieba_hmm помогает повысить точность сегментации ценой производительности индексации. Она должна использоваться вместе с morphology = jieba_chinese, см. Китайский, японский и корейский (CJK) и тайский языки.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_hmm = '0'POST /cli -d "
CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_hmm = '0'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'morphology' => 'jieba_chinese',
'jieba_hmm'='1'
]);utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'jieba_chinese\' jieba_hmm = \'0\'')await utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'jieba_chinese\' jieba_hmm = \'0\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'jieba_chinese\' jieba_hmm = \'0\'');utilsApi.sql("CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_hmm = '0'", true);utilsApi.Sql("CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_hmm = '0'", true);utils_api.sql("CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_hmm = '0'", Some(true)).await;table products {
morphology = jieba_chinese
jieba_hmm = 0
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}jieba_mode = {accurate|full|search}
Режим сегментации Jieba. Необязательный параметр; по умолчанию accurate.
В точном режиме (accurate) Jieba разбивает предложение на наиболее точные слова с использованием сопоставления по словарю. Этот режим ориентирован на точность, обеспечивая максимально возможную корректность сегментации.
В полном режиме (full) Jieba пытается разбить предложение на все возможные комбинации слов, стремясь включить все потенциальные слова. Этот режим ориентирован на максимизацию полноты охвата (recall), то есть он идентифицирует как можно больше слов, даже если некоторые из них перекрываются или используются реже. Он возвращает все слова, найденные в его словаре.
В режиме поиска Jieba разбивает текст на целые слова и более мелкие части, сочетая точную сегментацию с дополнительной детализацией, предоставляя перекрывающиеся фрагменты слов. Этот режим балансирует между точностью и полнотой, что делает его полезным для поисковых систем.
jieba_mode должен использоваться с morphology = jieba_chinese. Смотрите Языки с непрерывными сценариями (Chinese, Japanese, Korean (CJK) и Thai).
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_mode = 'full'POST /cli -d "
CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_mode = 'full'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'morphology' => 'jieba_chinese',
'jieba_mode'='full'
]);utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'jieba_chinese\' jieba_mode = \'full\'')await utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'jieba_chinese\' jieba_mode = \'full\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'jieba_chinese\' jieba_mode = \'full\'');utilsApi.sql("CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_mode = 'full'", true);utilsApi.Sql("CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_mode = 'full'", true);utils_api.sql("CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_mode = 'full'", Some(true)).await;table products {
morphology = jieba_chinese
jieba_mode = full
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}jieba_user_dict_path = path/to/stopwords/file
Путь к пользовательскому словарю Jieba. Опционально.
Jieba, библиотека для сегментации китайского текста, использует файлы словарей для помощи в разделении слов. Формат этих файлов словаря следующий: каждую строку содержит слово, разделенное на три части пробелами — само слово, частотность слова и часть речи (POS tag). Частотность слова и POS tag опциональны и могут быть опущены. Файл словаря должен быть в кодировке UTF-8.
Пример:
创新办 3 i
云计算 5
凱特琳 nz
台中
jieba_user_dict_path должен использоваться с morphology = jieba_chinese. Для более подробной информации см. Языки с непрерывными сценариями (Chinese, Japanese, Korean (CJK) и Thai).
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_user_dict_path = '/usr/local/manticore/data/user-dict.txt'POST /cli -d "
CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_user_dict_path = '/usr/local/manticore/data/user-dict.txt'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'morphology' => 'jieba_chinese',
'jieba_user_dict_path' = '/usr/local/manticore/data/user-dict.txt'
]);utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'jieba_chinese\' jieba_user_dict_path = \'/usr/local/manticore/data/user-dict.txt\'')await utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'jieba_chinese\' jieba_user_dict_path = \'/usr/local/manticore/data/user-dict.txt\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) morphology = \'jieba_chinese\' jieba_user_dict_path = \'/usr/local/manticore/data/user-dict.txt\'');CODE_BLOCK74utilsApi.Sql("CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_user_dict_path = '/usr/local/manticore/data/user-dict.txt'", true);utils_api.sql("CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_user_dict_path = '/usr/local/manticore/data/user-dict.txt'", Some(true)).await;table products {
morphology = jieba_chinese
jieba_user_dict_path = /usr/local/manticore/data/user-dict.txt
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}html_strip = {0|1}
Эта опция определяет, следует ли удалять HTML-разметку из входящих полнотекстовых данных. Значение по умолчанию — 0, что отключает удаление. Чтобы включить удаление, установите значение 1.
HTML-теги и сущности считаются разметкой и будут обработаны.
HTML-теги удаляются, а содержимое между ними (например, всё между <p> и </p>) остаётся нетронутым. Вы можете выбрать сохранение и индексацию атрибутов тегов (например, атрибута HREF в теге A или ALT в теге IMG). Некоторые известные строчные теги, такие как A, B, I, S, U, BASEFONT, BIG, EM, FONT, IMG, LABEL, SMALL, SPAN, STRIKE, STRONG, SUB, SUP и TT, удаляются полностью. Все остальные теги рассматриваются как блочные и заменяются пробелами. Например, текст te<b>st</b> будет проиндексирован как одно ключевое слово 'test', а te<p>st</p> — как два ключевых слова 'te' и 'st'.
HTML-сущности декодируются и заменяются соответствующими UTF-8 символами. Удалитель поддерживает как числовые формы (например, ï), так и текстовые формы (например, ó или ) сущностей, а также все сущности, указанные в стандарте HTML4.
Удалитель предназначен для работы с правильно сформированным HTML и XHTML, но может давать неожиданные результаты на некорректном вводе (например, HTML с лишними <'s или незакрытыми >'s).
Обратите внимание, что удаляются только сами теги, а также HTML-комментарии. Чтобы удалить содержимое тегов, включая встроенные скрипты, см. опцию html_remove_elements. Ограничений на имена тегов нет, то есть всё, что выглядит как начало, конец тега или комментарий, будет удалено.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) html_strip = '1'POST /cli -d "
CREATE TABLE products(title text, price float) html_strip = '1'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'html_strip' => '1'
]);utilsApi.sql('CREATE TABLE products(title text, price float) html_strip = \'1\'')await utilsApi.sql('CREATE TABLE products(title text, price float) html_strip = \'1\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) html_strip = \'1\'');utilsApi.sql("CREATE TABLE products(title text, price float) html_strip = '1'");utilsApi.Sql("CREATE TABLE products(title text, price float) html_strip = '1'");utils_api.sql("CREATE TABLE products(title text, price float) html_strip = '1'", Some(true)).await;table products {
html_strip = 1
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}html_index_attrs = img=alt,title; a=title;
Опция html_index_attrs позволяет указать, какие атрибуты HTML-разметки должны индексироваться, даже если остальная HTML-разметка удаляется. Значение по умолчанию — пустое, что означает, что атрибуты не будут индексироваться. Формат опции — перечисление индексируемых атрибутов для каждого тега, как показано в примере выше. Содержимое указанных атрибутов будет сохранено и проиндексировано, предоставляя способ извлечения дополнительной информации из ваших полнотекстовых данных.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) html_index_attrs = 'img=alt,title; a=title;' html_strip = '1'POST /cli -d "
CREATE TABLE products(title text, price float) html_index_attrs = 'img=alt,title; a=title;' html_strip = '1'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'html_index_attrs' => 'img=alt,title; a=title;',
'html_strip' => '1'
]);utilsApi.sql('CREATE TABLE products(title text, price float) html_index_attrs = \'img=alt,title; a=title;\' html_strip = \'1\'')await utilsApi.sql('CREATE TABLE products(title text, price float) html_index_attrs = \'img=alt,title; a=title;\' html_strip = \'1\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) html_index_attrs = \'img=alt,title; a=title;\' html_strip = \'1\'');utilsApi.sql("CREATE TABLE products(title text, price float) html_index_attrs = \'img=alt,title; a=title;\' html_strip = '1'");utilsApi.Sql("CREATE TABLE products(title text, price float) html_index_attrs = \'img=alt,title; a=title;\' html_strip = '1'");utils_api.sql("CREATE TABLE products(title text, price float) html_index_attrs = \'img=alt,title; a=title;\' html_strip = '1'", Some(true)).await;table products {
html_index_attrs = img=alt,title; a=title;
html_strip = 1
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}html_remove_elements = element1[, element2, ...]
Список HTML-элементов, содержимое которых, вместе с самими элементами, будет удалено. Необязательный параметр, по умолчанию — пустая строка (не удалять содержимое никаких элементов).
Эта опция позволяет удалять содержимое элементов, то есть всё между открывающим и закрывающим тегами. Она полезна для удаления встроенных скриптов, CSS и т.д. Короткая форма тега для пустых элементов (например,
) корректно поддерживается, и текст после такого тега не будет удалён.
Значение представляет собой список имён элементов (тегов), разделённых запятыми, содержимое которых должно быть удалено. Имена тегов нечувствительны к регистру.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) html_remove_elements = 'style, script' html_strip = '1'POST /cli -d "
CREATE TABLE products(title text, price float) html_remove_elements = 'style, script' html_strip = '1'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'html_remove_elements' => 'style, script',
'html_strip' => '1'
]);utilsApi.sql('CREATE TABLE products(title text, price float) html_remove_elements = \'style, script\' html_strip = \'1\'')await utilsApi.sql('CREATE TABLE products(title text, price float) html_remove_elements = \'style, script\' html_strip = \'1\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) html_remove_elements = \'style, script\' html_strip = \'1\'');utilsApi.sql("CREATE TABLE products(title text, price float) html_remove_elements = \'style, script\' html_strip = '1'");utilsApi.Sql("CREATE TABLE products(title text, price float) html_remove_elements = \'style, script\' html_strip = '1'");utils_api.sql("CREATE TABLE products(title text, price float) html_remove_elements = \'style, script\' html_strip = '1'", Some(true)).await;table products {
html_remove_elements = style, script
html_strip = 1
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}index_sp = {0|1}
Управляет обнаружением и индексацией границ предложений и абзацев. Необязательный параметр, по умолчанию 0 (обнаружение и индексация отключены).
Эта директива включает обнаружение и индексацию границ предложений и абзацев, что позволяет работать операторам SENTENCE и PARAGRAPH. Обнаружение границ предложений основано на анализе простого текста и требует только установки index_sp = 1 для включения. Однако обнаружение абзацев зависит от HTML-разметки и происходит в процессе удаления HTML. Таким образом, для индексации границ абзацев обе директивы, index_sp и html_strip, должны быть установлены в 1.
Для определения границ предложений используются следующие правила:
- Вопросительные знаки (?) и восклицательные знаки (!) всегда обозначают границу предложения.
- Точки в конце предложения (.) обозначают границу предложения, за исключением следующих случаев:
- Когда за точкой следует буква. Это считается частью аббревиатуры (например, "S.T.A.L.K.E.R." или "Goldman Sachs S.p.A.").
- Когда за точкой следует запятая. Это считается аббревиатурой, за которой следует запятая (например, "Telecom Italia S.p.A., основанная в 1994 году").
- Когда за точкой следует пробел и строчная буква. Это считается аббревиатурой внутри предложения (например, "News Corp. объявила в феврале").
- Когда перед точкой стоит пробел и заглавная буква, а после точки — пробел. Это считается инициалом (например, "John D. Doe").
Границы абзацев определяются по каждому HTML-тегу блочного уровня, включая: ADDRESS, BLOCKQUOTE, CAPTION, CENTER, DD, DIV, DL, DT, H1, H2, H3, H4, H5, LI, MENU, OL, P, PRE, TABLE, TBODY, TD, TFOOT, TH, THEAD, TR и UL.
Как предложения, так и абзацы увеличивают счетчик позиций ключевых слов на 1.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) index_sp = '1' html_strip = '1'POST /cli -d "
CREATE TABLE products(title text, price float) index_sp = '1' html_strip = '1'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'index_sp' => '1',
'html_strip' => '1'
]);utilsApi.sql('CREATE TABLE products(title text, price float) index_sp = \'1\' html_strip = \'1\'')await utilsApi.sql('CREATE TABLE products(title text, price float) index_sp = \'1\' html_strip = \'1\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) index_sp = \'1\' html_strip = \'1\'');utilsApi.sql("CREATE TABLE products(title text, price float) index_sp = \'1\' html_strip = '1'", true);utilsApi.Sql("CREATE TABLE products(title text, price float) index_sp = \'1\' html_strip = '1'", true);utils_api.sql("CREATE TABLE products(title text, price float) index_sp = \'1\' html_strip = '1'", Some(true)).await;table products {
index_sp = 1
html_strip = 1
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}index_zones = h*, th, title
Список HTML/XML зон внутри поля, которые должны быть проиндексированы. По умолчанию это пустая строка (зоны индексироваться не будут).
"Зона" определяется как всё, что находится между открывающим и соответствующим закрывающим тегом, и все участки с одинаковым именем тега называются "зоной". Например, всё между <H1> и </H1> в поле документа принадлежит зоне H1.
Директива index_zones включает индексацию зон, но также должен быть включен HTML стриппер (путем установки html_strip = 1). Значение index_zones должно быть списком имен тегов и шаблонов (заканчивающихся звездочкой), разделенных запятыми, которые будут индексироваться как зоны.
Зоны могут быть вложенными и перекрываться, при условии, что каждый открывающий тег имеет соответствующий закрывающий тег. Зоны также могут использоваться для сопоставления с оператором ZONE, как описано в расширенном синтаксисе запросов.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
- CONFIG
CREATE TABLE products(title text, price float) index_zones = 'h, th, title' html_strip = '1'POST /cli -d "
CREATE TABLE products(title text, price float) index_zones = 'h, th, title' html_strip = '1'"$index = new \Manticoresearch\Index($client);
$index->setName('products');
$index->create([
'title'=>['type'=>'text'],
'price'=>['type'=>'float']
],[
'index_zones' => 'h*,th,title',
'html_strip' => '1'
]);utilsApi.sql('CREATE TABLE products(title text, price float) index_zones = \'h, th, title\' html_strip = \'1\'')await utilsApi.sql('CREATE TABLE products(title text, price float) index_zones = \'h, th, title\' html_strip = \'1\'')res = await utilsApi.sql('CREATE TABLE products(title text, price float) index_zones = \'h, th, title\' html_strip = \'1\'');utilsApi.sql("CREATE TABLE products(title text, price float) index_zones = 'h, th, title' html_strip = '1'", true);utilsApi.Sql("CREATE TABLE products(title text, price float) index_zones = 'h, th, title' html_strip = '1'", true);utils_api.sql("CREATE TABLE products(title text, price float) index_zones = 'h, th, title' html_strip = '1'", Some(true)).await;table products {
index_zones = h*, th, title
html_strip = 1
type = rt
path = tbl
rt_field = title
rt_attr_uint = price
}Manticore позволяет создавать распределённые таблицы, которые работают как обычные plain или real-time таблицы, но на самом деле являются коллекцией дочерних таблиц, используемых для поиска. Когда запрос отправляется в распределённую таблицу, он распределяется по всем таблицам в коллекции. Затем сервер собирает и обрабатывает ответы для сортировки и при необходимости перерасчёта значений агрегатов.
С точки зрения клиента, создаётся впечатление, что он выполняет запрос к одной таблице.
Распределённые таблицы могут состоять из любых комбинаций таблиц, включая:
- Локальные таблицы хранения (plain table и Real-Time)
- Удалённые таблицы
- Комбинация локальных и удалённых таблиц
- Percolate таблицы (локальные, удалённые или комбинация)
- Одна локальная и несколько удалённых таблиц или любая другая комбинация
Смешивание percolate и шаблонных таблиц с plain и real-time таблицами не рекомендуется.
Распределенная таблица определяется как тип 'distributed' в файле конфигурации или через SQL-предложение CREATE TABLE.
- Config
- SQL
table foo {
type = distributed
local = bar
local = bar1, bar2
agent = 127.0.0.1:9312:baz
agent = host1|host2:tbl
agent = host1:9301:tbl1|host2:tbl2 [ha_strategy=random retry_count=10]
...
}CREATE TABLE distributed_table type='distributed'
local='local_table'
agent='127.0.0.1:9312:remote_table';Суть распределённой таблицы заключается в списке дочерних таблиц, на которые она ссылается. Существует два типа дочерних таблиц в распределённой таблице:
-
Локальные таблицы: Это таблицы, обслуживаемые на том же сервере, что и распределённая таблица. Для перечисления локальных таблиц используется синтаксис
local =. Вы можете указать несколько локальных таблиц с помощью нескольких строкlocal =или объединить их в один список, разделённый запятыми. -
Удалённые таблицы: Это таблицы, обслуживаемые вне сервера. Для перечисления удалённых таблиц используется синтаксис
agent =. Каждая строка представляет один endpoint или агент. Каждый агент может иметь несколько внешних локаций и опций того, как он должен работать. Подробнее здесь. Важно отметить, что сервер не имеет информации о типе таблицы, с которой он работает. Это может привести к ошибкам, если, например, вы выполнитеCALL PQдля удалённой таблицы 'foo', которая не является percolate таблицей.
Распределенная таблица в Manticore Search действует как "главный узел", который проксирует требуемый запрос к другим таблицам и предоставляет объединенные результаты из полученных ответов. Сама таблица не хранит никаких данных. Она может подключаться как к локальным таблицам, так и к таблицам, расположенным на других серверах. Локальная распределенная таблица — это просто распределенная таблица, все дочерние таблицы которой являются локальными. Если вам нужно только совместно искать по нескольким локальным таблицам, вы можете запрашивать их напрямую, без создания распределенной таблицы. Если вы все же создаете локальную распределенную таблицу, в SQL вы можете указать несколько локальных таблиц либо путем повторения local='...', либо передав их в виде списка, разделенного запятыми, в одном предложении local='index1,index2'.
- Config
- SQL
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
table table_dist {
type = distributed
local = tbl1
local = tbl2
...
}CREATE TABLE local_dist type='distributed' local='index1,index2';$params = [
'body' => [
'settings' => [
'type' => 'distributed',
'local' => [
'tbl1',
'tbl2'
]
]
],
'table' => 'products'
];
$table = new \Manticoresearch\Table($client);
$table->create($params);utilsApi.sql('CREATE TABLE local_dist type=\'distributed\' local=\'tbl1\' local=\'tbl2\'')await utilsApi.sql('CREATE TABLE local_dist type=\'distributed\' local=\'index1\' local=\'index2\'')res = await utilsApi.sql('CREATE TABLE local_dist type=\'distributed\' local=\'tbl1\' local=\'tbl2\'');utilsApi.sql("CREATE TABLE local_dist type='distributed' local='tbl1' local='tbl2'");utilsApi.Sql("CREATE TABLE local_dist type='distributed' local='tbl1' local='tbl2'");utils_api.sql("CREATE TABLE local_dist type='distributed' local='index1' local='index2'", Some(true)).await;Прямой запрос к нескольким локальным таблицам работает как в SQL, так и в JSON.
- SQL
- JSON
SELECT * FROM index1, index2, index3;POST /search
{
"table": "index1,index2,index3",
"query": { "match_all": {} }
}