Полнотекстовый поиск для русского языка со стеммингом. Ноль зависимостей и сторонних библиотек.
Инициализация поиска.
s, e := search.New(&search.Configs{
StopWords: "corpus/stop-words.json",
Dump: "search.gob",
})
if e != nil {
log.Fatal(e)
}
При инициализации поиска необходимо передать конфигурацию, в которой указан путь до корпуса русских стоп-слов и путь до gob файла поиска. Если gob файл создан, поиск загрузит векторы индексов в хеш-таблицу.
Вставка и индексация документа.
s.Insert(1, x)
В данном примере метод Insert принимает первым параметром идентификатор документа и документ вторым параметром. Метод производит очистку текста от спецсимволов и пунктуации, затем приводит в нижний регистр и далее удаляет из текста все стоп-слова. После этого итерация каждого слова делает стемминг и записывает индекс документа в хеш-таблицу.
Поиск.
b, e := s.Find("исследование роторной гидропоники")
if e != nil {
log.Fatal(e)
}
В качестве единственного аргумента метод принимает поисковой запрос и отдает срез байт сериализованного json массива. Массив ответа содержит идентификатор документа и количество поисковых совпадений в каждом элементе. Следовательно, чем больше число совпадений, тем выше фактор ранжировния.
Полный пример.
package main
import (
"fmt"
"log"
"github.com/michail-vestnik/search"
)
const (
x = "В современном мире весьма активно начинает развиваться растениеводство без контакта с грунтом. Проведен обзор различных роторных гидропонных систем, существующих и разрабатываемых. Современные образцы ещё нуждаются в систематизации подбора материалов, системных и программных компонентов, из которых они будут собираться, выборе наиболее оптимальных, в зависимости от выращиваемой культуры, габаритов. Для исследования возможностей конструкции, надежности и функционала установки была разработана и собрана модель роторной гидропоники, для изучения технических особенностей выращивания в роторной гидропонике."
y = "В работе исследованы перспективы развития новой отрасли авиации: полёты на ионном ветре. Представлена экспериментальная схема модели ионолёта, определены особенности его конструкции. Рассмотрено возможное применение устройства в авиационной и космической отраслях."
z = "Рассмотрены необходимость исследования первоначал сетецентрической войны (далее – СЦВ) и содержание положений научных произведений, косвенно к ним относящихся. Обнаружена элементная составляющая относительно предмета анализа. Результат работы выражен формулировкой понятия «первоначала СЦВ». Оно представлено как её условия существования и причины проведения, которые в своей совокупности / по отдельности способствуют повышению эффективности управления войсками и оружием, предоставлению участникам военных операций объективных сведений о расстановке сил и средств на поле боя в режиме реального времени или затрудняют подобное."
)
func main() {
s, e := search.New(&search.Configs{
StopWords: "corpus/stop-words.json",
Dump: "search.gob",
})
if e != nil {
log.Fatal(e)
}
s.Insert(1, x)
s.Insert(2, y)
s.Insert(3, z)
b, e := s.Find("исследование роторной гидропоники")
if e != nil {
log.Fatal(e)
}
e = s.Save()
if e != nil {
log.Fatal(e)
}
fmt.Printf("b: %v\n", string(b))
}
Спасибо за просмотр.