Основные данные находят одно совпадение по двум атрибутам - PullRequest
0 голосов
/ 05 ноября 2018

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

Допустим, у вас есть основной объект данных с тремя атрибутами, как показано ниже:

firstname string
lastname string
Employee_id string

И у вас есть следующие управляемые объекты

Jane | Smith | 1
Jane | Smiley | 2
Jane | Doe | 3
John | Doe | 4
Richard | Doe | 5

Как бы вы получили идентификатор сотрудника для строки «Джейн Доу» или «Доу Джейн» или «Учет Доу Джейн»?

Если вы точно знали, что было всего два слова, и порядок был имя, второе имя, тогда вы могли бы сделать.

NSArray *words = [string componentsSeparatedByString:@" "];   
NSPredicate *pred = [NSPredicate predicateWithFormat:@"firstname beginswith[cd] %@ AND lastname beginswith[cd]", words[0],words[1]];

Но в этом случае я не знаю порядок или количество слов.

Заранее спасибо за любые предложения.

1 Ответ

0 голосов
/ 05 ноября 2018

Вы можете использовать NSCompoundPredicate и поместить группу NSPredicates с различными возможностями упорядочения, такими как те, которые вы сделали в вашем примере, но это, очевидно, будет ограничено количеством слов, для которых вы хотите написать предикатные комбинации.

(возможно, очевидно, но вы создаете серию предикатов, таких как: ((stringA и string B) или (stringB и stringA), или (stringA и stringC) или (stringC и stringA) или (stringB и stringC) или (строка C и строка B)).

Вы можете создать эти предикаты относительно чисто, написав предикат с переменными, а затем повторно используя predicateWithSubstitutionVariables: с другим словарем переменных -> сопоставления слов, чтобы получить различные схемы.

Хитрость в том, что в какой-то момент вы пытаетесь выполнить произвольный полнотекстовый поиск по структурированным данным без полнотекстового индекса. Вот достойное сообщение в блоге (хотя и старое) о трудностях, связанных с этим.

Альтернативой является разработка вашего пользовательского интерфейса, чтобы пользователь мог получить данные в более простой форме. Например, дайте пользователю форму для своего запроса с допустимыми полями для заполнения. Или, по крайней мере, направьте ему текст приглашения для вашего единственного текстового поля с открытой записью с чем-то вроде «Введите имя и фамилию человека» или что-то еще, что имеет смысл .

...