Полнотекстовый поиск - как выбрать, не проверяя?
От: Shmj Ниоткуда  
Дата: 24.07.21 10:51
Оценка:
Такой вопрос. Допустим вам нужен полнотекстовый поиск по некому списку сообщений. Если этих сообщений, к примеру, 150 тыс. и общий их объем данных около 150 Мб — то это говно-вопрос, по сути, можно просто тупо искать без всякой индексации, загрузив единожды все это дело в ОЗУ. Будет быстро.

  Скрытый текст
using System;
using System.Diagnostics;
using System.Text;

namespace ConsoleApp24
{
    class Program
    {
        static void Main(string[] args)
        {
            var sb = new StringBuilder();

            for (int i = 0; i < 150_000; i++)
            {
                if (i == 75_000)
                    sb.Append("иголка");

                sb.Append(GetRandom1024bString());
            }

            string s = sb.ToString();

            Stopwatch sw = new Stopwatch();
            sw.Reset();
            sw.Start();
            int index = s.IndexOf("иголка", StringComparison.Ordinal);
            sw.Stop();

            Console.WriteLine(index);
            Console.WriteLine(sw.ElapsedMilliseconds);

            Console.WriteLine("Hello World!");
        }


        private static Random _random = new Random();
        public static string GetRandom1024bString()
        {
            StringBuilder sb = new StringBuilder(1024);

            for (int i = 0; i < 1024; i++)
            {
                sb.Append((char) _random.Next(32, 122));
            }

            return sb.ToString();
        }
    }
}


Вывод:

76800000
17


Просто тупой поиск на моем старом ноуте — 17 миллисекунд. А что такое 150 МБ памяти по нашим временам? Да это пустое место, которым можно пренебречь.

Ок. Как сделать дешевле? Или если данных мало, несколько сотен мегабайт — то самое тупое решение будет ничем не хуже промышленного?

Берем СУБД бесплатную и популярную. Номер 1 сейчас — это postgre (ранее была MySQL) — кто мы такие, чтобы противиться сообществу. Там есть полнотекстовый поиск из коробки. Загружаем эти же 150 Мб. текста, разбив на порции. Но почему-то получилось медленее, видимо связано с тем, что хранится на диске все это дело и пока данных мало, то смысла в СУБД нет (или типа выбрать опцию, чтобы не загружала на диск а держала в памяти данные этой таблицы).

Далее, еще все юзают Elastic Search. Тоже нужно ставить и проверять как поведет себя именно с твоим количеством данных.

Ну и вопрос. Можно ли как-то сделать выбор не проверяя все самому? То есть какая-то сводная таблица с результатами тестов и пр. — есть где-нибудь?
Отредактировано 24.07.2021 10:52 Shmj . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.