Спасибо большое, всем за интересные обсуждения и советы!
Попытаюсь дополнить что я вижу, и зачем мне этот поиск.
База создана в нашей фирме, так как мы провели математическое моделирование тех молекул, что есть в этой базе для другого проекта, а резульаты такого мататематического моделирования мы решили предоставлять бесплатно всем и вдальнейшем регулярно пополнять. То есть мы предоставляем полностью бесплатную возможность поиска всех 1.7 миллиардов конформеров и сохранения результатов поиска с стандартном MOL формате, но саму базу скачать у нас нельзя - мы это не даем, также как и не разглашаем все детали алгоритмов, которые позволили сохранить всю этту информацию всего-то в 260 гигабайтах с довольно быстрым индексированием.
У нас есть какое-то число пользователей, на данный момент довольно маленькое. Многие регулярные пользователи утверждают, что база довольно полезна, но им хотелось бы добавить поиск по названию или части.
Почему это нужно.
Вот допустим, Вы ищите глюкозу. Если Вам известна брутто формула (C6H12O6), вы ее конечно можете вбить, но, результаты поиска Вас, к сожалению не обрадуют. Их будет больше 5000 и Вы можете не найти в этих результатах искомую глюкозу просто недолистав до нужной страницы. На данный момент дополнительно Вы можете указать кучу дополнительных свойств, как например, число двойных-тройных связей, наличие каких-либо функциональных групп, и сильно сузить поиск, но все равно будет десятки-сотни результатов, а может и десятки-сотни страниц результатов поиска.
Я хочу добвить часть лексемы из названия (у нас есть и номенклатурные и общеупотребительные названия), и дополнить способ поиска по какой-то лексеме.
В случае глюкозы, либо надо будет написать еще в одном поле "glucose" либо хотя бы "tetrol".
У меня есть названия, я могу получить с них лексемы, и найти наиболее употребительные лексемы, либо пойти по принципу гугла. Но в моем случае, напрямую подход Гугла с резреженным сингулярным разложением, как мне кажется, не будет работать, так как мне надо выщемлять из названия общеупотребительные части, и делать это автоматически. Я не хочу это делать руками, я хочу придумать автоматический способ нахождения таких лексем, так как в базе около 100 миллионов названий и часто у названия есть еще несколько синонимов.
Собственно поэтому этот вопрос тут и возник. То есть также, с радостью прислушаюсь к любым Вашим предложениям как удобнее искать по названию в нашей базе.
-- 03.01.2022, 01:55 --Пользователь же не будет вводить всю строку, начиная с "(2E,5R)", а скорее начнет с "pyrimidine-6-carboxylic acid"? Или нет?
да, верно, более того, хочется, чтобы пользователь мог ввести две-три правильные лексемы, типа "pyrimidine" + "carboxylic" + "acid" и, добавив бруттто-формулу получил уже очень ограниченный результат поиска, в котором не надо долго искать то, что ему надо.
-- 03.01.2022, 01:57 --Вы вроде писали, что работаете в компании, которая разрабатывает софт для ЯМР спектрометров?
да, верно, и не только софт, но и железки, а база как раз как побочный продукт производства таких спектометров и вышла.
-- 03.01.2022, 01:59 --Так ли нужно именно хэшировать? Каждая лексема в данном случае - "вещь в себе", ее можно просто обозначить одним битом. Например так:
1. Анализируем всю базу, выделяем все лексемы
2. Нумеруем лексемы
3. Создаем битовые маски для каждого вещества
4. Анализируем запрос, выделяем лексемы запроса
5. Из лексем делаем битовую маску.
Допустим, в БД есть вещества с лексемами "метил" (№1), "спирт" (№2), "эфир" (№3). Пользователь вводит запрос, содержащий "метил" и "спирт". Получается битовая маска 110.
правильно, именно так у нас по радикалам поиск устроен, но у меня основная проблема - как автоматически выделить лексемы, чтобы они были наиболее информативны и их не было очень много.