Содержит любое слово строки

Я пытаюсь получить из базы данных любое имя или тег, которые соответствуют любому слову из строки.
Что-то вроде поиска.

Пример:

Запрос: "Любой соответствующий запрос"

У меня есть первая таблица с именем и вторая с тегами для первой таблицы.

Мне нужно что-то подобное, а не производительность. Это не сработает, т.к. Содержит проверку всей строки.

_db.Tag_Table.Where(t => t.First_Table.Name.Contains(query) || 
t.Tag_Table.Value.Contains(query))
                .Select(s => s.First_Table).ToList();

Любое разумное решение для этого.


person Softouch    schedule 06.07.2018    source источник
comment
Этот вопрос является немного общим, чтобы ответить на него definitvely. Это пахнет проблемой XY, поэтому я рекомендую вам опубликовать свои фактические требования. В зависимости от вашей СУБД вам может понадобиться полнотекстовый индекс. Проверьте эта ссылка для SQL Server FTI.   -  person Sefe    schedule 06.07.2018
comment
Нужно ли сопоставлять подстроку «содержит» со словами в Tag_Table? Было бы намного эффективнее, если бы вы могли сопоставлять целые слова из Tag_Table с каждым из элементов строки поиска. Я считаю, что это просто переведет в пункт «Имя в (...)».   -  person user1751825    schedule 06.07.2018


Ответы (2)


Я думаю, что нашел решение, я думаю, оно возвращает правильные результаты.

var queryList = query.Split(' ');

_db.Post.Where(f => queryList.Any(q => f.Title.Contains(q)) || queryList.Any(l => f.Tags.Any(t => t.Tag.Value.Contains(l))));

В каждом сообщении для каждого слова запроса, которое я ищу в заголовке сообщения или имени каждого тега в таблице тегов. Я возвращаю результат, если у меня есть слово запроса в заголовке или в теге.

Спасибо за ответ. Похоже, второй ответ @Zeeshan Adil похож.

person Softouch    schedule 06.07.2018

не могли бы вы попробовать это и дайте мне знать, если это сработало в комментариях:

 string[] terms = Query.Split(' ');
 string[] Results;

 string[] all = (from x in _db.Tag_Table
                    select x.Name).ToArray();

 Results =(from z in all
                       from w in terms 
                       where z.Contains(w)
                       select z).Distinct().ToArray();

Изменить

также, пожалуйста, попробуйте это:

string Query = "some value";
string[] terms = Query.Split(' ');


from x in _db.Tag_Table
           where terms.Any(val => p.First_Table.Name.Contains(val))
           select x;
person Zeeshan Adil    schedule 06.07.2018
comment
Вы выполняете поиск в памяти столбца БД с неизвестным (и потенциально большим) количеством записей. Это то, что БД, безусловно, может сделать лучше. - person Sefe; 06.07.2018
comment
@Sefe Я только что отредактировал ответ и добавил другое решение, но я не уверен в этом, что вы об этом думаете? - person Zeeshan Adil; 06.07.2018
comment
Теперь это будет выполняться в БД (я предполагаю, что вы пробовали код, и он работает). Насчет производительности сложно сказать. Вопрос расплывчатый, и для хорошего ответа, я думаю, нам понадобится больше информации. - person Sefe; 06.07.2018
comment
@Sefe С нетерпением жду дополнительной информации от парня - person Zeeshan Adil; 06.07.2018
comment
@ZeeshanAdil Я опубликовал решение, которое возвращает правильные результаты. Я не знаю о производительности. Думаю, что у меня не будет слишком много постов. - person Softouch; 06.07.2018
comment
@Sefe Я прочитаю ссылку, которую вы разместили. Могу ли я сделать это быстрее с FTI? Но у меня есть таблица тегов, которая содержит идентификатор сообщения и идентификатор тега. Я должен искать каждый тег в таблице тегов. - person Softouch; 06.07.2018