У меня есть очень простой индекс с двумя полями - поле с числовым идентификатором и поле с длиной от 60 до 100 символов. Строковое поле содержит последовательности ДНК, без пробелов.Не удается решить узкое место в поиске Lucene.net на Azure
Так, например, заданное значение поля: AATCTAGATACGAGATCGATCGATCGATCGATCGATCGATGCTAGC
и SearchString будет что-то вроде: GATCGATCGA
Есть более 7 миллиона строк, а индекс приходит примерно 1 Гб.
Я сохраняю индекс в хранилище azure blob и запускаю простое веб-приложение, которое запрашивает индекс в экземпляре веб-приложения B1.
Независимо от размера строки поиска, я не могу заставить операцию работать быстрее, чем 20-21 секунд.
Я пробовал масштабирование до экземпляра B3, но все же он входил через 20 секунд.
Я выделил узкое место , когда запрос выполняется против IndexSearcher.
Чтобы найти, я прикрепляю шаблон к началу и концу строки поиска.
Мой код выглядит следующим образом
var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "nucleotide", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30));
parser.AllowLeadingWildcard = true;
var storageAccount = CloudStorageAccount.Parse("connection info");
var azureDir = new AzureDirectory(storageAccount, "myindex", new RAMDirectory());
IndexSearcher searcher = new IndexSearcher(azureDir, true);
var query = parser.Parse("*" + mystring + "*");
TopDocs hits = searcher.Search(query, 50);
Ваш поиск '* term *' требует полной итерации всех терминов, которые будут выполняться навсегда. Я предполагаю, что у вас много условий. Не могли бы вы разбить его при индексировании на GA + TC + ... и затем искать те, которые используют позиционную информацию? (Как phraseQuery) – sisve
Я знаю, что я знаю, но начать поиск с дикой карты будет медленным. Это все равно 350/миллисекунда, и ему нужно прикоснуться к каждой строке, что неплохо. Может быть, попробуйте карту в байт и регулярное выражение, но все еще не уверены, что бьет 350/миллисекунда. – Paparazzi
'* x *' всегда будет медленным поиском. Я очень впечатлен, что это так быстро, учитывая. –