Я пишу внутреннее приложение, которое содержит несколько частей информации о тексте, а также много частей данных об этих частях текста. Эти части данных будут сохранены в базе данных (SQL Server, хотя это могло измениться) в порядке записи.
Я хотел бы смочь искать самое соответствующее из этих сведений с самым соответствующим из них, чтобы быть наверху. Я первоначально изучил использование Полнотекстового поиска SQL Server, но это не столь гибко для моих других потребностей, как я надеялся, таким образом, кажется, что я должен буду разработать свое собственное решение этого.
Из того, что я понимаю то, что необходимо, инвертированный индекс, затем для содержания упомянутого инвертированного индекса, который будет восстановлен и изменен на основе результатов содержимой дополнительной информации (хотя на данный момент это может быть оставлено для более поздней даты, поскольку я просто хочу, чтобы инвертированный индекс индексировал основной текст от таблицы базы данных / обеспеченные строки).
У меня была трещина при написании этого кода в Java с помощью Хеш-таблицы с ключом как слова и значение как список случаев слова, но во всей честности я являюсь все еще довольно новым в C# и только действительно использовал вещи как DataSets и DataTables при обработке информации. Если требуется я загружу код Java скоро, после того как я очистил этот ноутбук вирусов.
Если данный ряд записей от таблицы или из Списка Строк, как можно было создать инвертированный индекс в C#, который предпочтительно сохранит в Набор данных/Таблицу данных?
Править: Я забыл упоминать, что я уже попробовал Lucene и Nutch, но требую моего собственного решения, поскольку изменение Lucene для удовлетворения моих потребностей взяло бы намного дольше, чем запись инвертированного индекса. Я буду обрабатывать много метаданных, этому также будет нужна обработка, после того как основной инвертированный индекс завершается, таким образом, все, чего я требую на данный момент, является основным полнотекстовым поиском на одной области с помощью инвертированного индекса. Наконец, работа над инвертированным индексом не что-то, что я получаю для делания каждый день, таким образом, было бы замечательно иметь трещину в нем.
Вот грубый обзор подхода, который я успешно использовал в C # в прошлом:
struct WordInfo
{
public int position;
public int fieldID;
}
Dictionary<string,List<WordInfo>> invertedIndex=new Dictionary<string,List<WordInfo>>();
public void BuildIndex()
{
foreach (int fieldID in GetDatabaseFieldIDS())
{
string textField=GetDatabaseTextFieldForID(fieldID);
string word;
int position=0;
while(GetNextWord(textField,out word,ref position)==true)
{
WordInfo wi=new WordInfo();
if (invertedIndex.TryGetValue(word,out wi)==false)
{
invertedIndex.Add(word,new List<WordInfo>());
}
wi.Position=position;
wi.fieldID=fieldID;
invertedIndex[word].Add(wi);
}
}
}
Примечания:
GetNextord () итерации через поле и возвращает следующее слово и положение Отказ Для реализации его взгляда на использование String.indexof () и методов проверки типа символов Char (ISALPHA ITC).
GetDatabaseTextFieldForid () и GetDatabaseFieldiDs () являются самосназывающимися, реализующими по мере необходимости.
Lucene.net Может быть вашим лучшим ставкам. Это зрелый полный текстовый поисковой системой с использованием перевернутых индексов .
http://codeclimber.net.nz/archive/2009/09/02/lucene.net-your-first-application.aspx
Обновление:
Я написал небольшую библиотеку для индексации Коллекции памяти с помощью Lucene.net - это может быть полезно для этого. https://github.com/mcintyre321/linqdex
Если вы хотите вращать свои собственные, словарь
класс, скорее всего, будет ваша база, как ваша Java Hashtables Отказ Что касается того, что хранится в качестве значений в словаре, его трудно сказать на основе предоставленной вами информации, но обычно алгоритмы поиска используют некоторые тип заданной структуры, чтобы вы могли запускать профсоюзы и пересечения. LINQ дает вам большую часть этой функциональности на любом Ienumerable
, хотя специализированный класс набора может повысить производительность.
Одним из таких реализаций набора находится в WINTELLECT PowerCollections . Я не уверен, что это даст вам любую выгоду от производительности или не в течение LINQ.
на данный набор данных
, я не уверен, что вы представляете. Я не знаю о том, что «автоматически» пишет на набор данных
. Я подозреваю, что вам придется написать это сами, тем более что вы упомянули несколько раз о других сторонах сторонних вариантов, которые не достаточно гибки.