Я пытаюсь использовать MongoDB для реализации словаря естественного языка. У меня есть коллекция лексем, каждая из которых имеет несколько словоформ в качестве поддокументов. Это то, что выглядит как одна лексема:
{
"_id" : ObjectId("51ecff7ee36f2317c9000000"),
"pos" : "N",
"lemma" : "skrun",
"gloss" : "screw",
"wordforms" : [
{
"number" : "sg",
"surface_form" : "skrun",
"phonetic" : "ˈskruːn",
"gender" : "m"
},
{
"number" : "pl",
"surface_form" : "skrejjen",
"phonetic" : "'skrɛjjɛn",
"pattern" : "CCCVCCVC"
}
],
"source" : "Mayer2013"
}
В настоящее время у меня есть коллекция из 4000 лексем, и каждый из них имеет в среднем список из 1000 словоформ (в отличие от всего 2 выше). Это означает, что у меня есть 4 000 000 уникальных форм слова в коллекции, и я должен иметь возможность искать их в течение разумного промежутка времени.
Обычный запрос будет выглядеть так:
db.lexemes.find({"wordforms.surface_form":"skrejjen"})
У меня есть индекс на wordforms.surface_form
, и этот поиск выполняется очень быстро.
Однако, если я хочу иметь подстановочные знаки в моем поиске, производительность неистовая. Например:
db.lexemes.find({"wordforms.surface_form":/skrej/})
занимает более 5 минут (после чего я сдался). Как упоминалось в этом вопросе, поиск регулярных выражений по индексам, как известно, является плохим. Я знаю, что добавление якоря в регулярном выражении помогает много, но это также сильно ограничивает возможности моего поиска. Даже если я готов сделать эту жертву, я заметил, что время ответа может сильно варьироваться в зависимости от регулярного выражения. Запрос
db.lexemes.find({"wordforms.surface_form":/^s/})
Заканчивается 35.
Лучшие результаты, которые я получил до сих пор, фактически были, когда я отключил индекс, используя hint
.
В этом случае ситуация значительно улучшается. Этот запрос:
db.lexemes.find({"wordforms.surface_form":/skrej/}).hint('_id_')
занимает около 3 секунд.
Мой вопрос: есть ли что-то еще, что я могу сделать, чтобы улучшить эти поисковые запросы? Как бы то ни было, они все еще немного медленны, и я уже рассматриваю возможность перехода на MySQL в надежде получить производительность. Но я действительно хотел бы сохранить гибкость Mongo и избежать всей утомительной нормализации в РСУБД. Какие-либо предложения? Считаете ли вы, что я столкнусь с некоторой медлительностью, независимо от механизма БД, с таким количеством текстовых данных?
Я знаю о Mongo new текстовый поиск, но преимущества этого (токенизация и выведение) в моем случае не актуальны (не для упоминание мой язык не поддерживается). Неясно, действительно ли текстовый поиск быстрее, чем при использовании regex.