Lucene - запрос с длинными строками - PullRequest
0 голосов
/ 24 марта 2010

У меня есть индекс с полем «Принадлежность», некоторые примеры значений:

  • "Медицинский факультет Стэнфордского университета, Пало-Альто, Калифорния, США",
  • "Институт нейробиологии, медицинский факультет, Стэнфордский университет, Пало-Альто, Калифорния",
  • "Медицинский факультет Гарвардского университета, Бостон М.А.",
  • "Brigham & Women's, Медицинский факультет Гарвардского университета, Бостон, Массачусетс"
  • "Гарвардский университет, Кембридж, Массачусетс"

и т. Д. (Суть в том, что присоединения написаны несколькими способами без видимой последовательности)

Я запрашиваю индекс в поле присоединения, используя, скажем, «Медицинский факультет, Стэнфордский университет, Пало-Альто, Калифорния» (с QueryParser), чтобы найти все документы, связанные со Стэнфордом, я получаю много ложных ответов, предположительно из-за наличие Медицинского факультета и т. д. и т. д. (примечание: я не могу использовать Фразовый запрос из-за различий в способах построения аффилиации)

Я пробовал следующее:

  1. Используйте SpanNearQuery, разделив поисковую фразу пробелом (здесь я не получаю результатов!)

  2. Попытка повышения (используя ^) путем разделения запятой и усиления последних частей, таких как «Пало-Альто-СА», с гораздо более высоким усилением, чем начальные фразы. Здесь я все еще получаю много ложных + весов.

Любые предложения о том, как подойти к этому? Если SpanNearQuery путь, Есть идеи, почему я получаю 0 результатов?

Ответы [ 2 ]

1 голос
/ 24 марта 2010

Используете ли вы ИЛИ поиск вместо AND?

Вы можете установить оператор по умолчанию в AND с помощью QueryParser.setDefaultOperator(). Установка оператора по умолчанию на AND должна устранить все ложные срабатывания. Но вы можете рискнуть получить ложные отрицания, если ваши индексированные значения равны "Stanford University School of Medicine, Palo Alto, CA ", и вы ищете "Stanford University School of Medicine, Palo Alto, CA USA", (обратите внимание на дополнительный термин USA в запросе.)

Если ваши запросы не будут содержать больше терминов, чем проиндексированное значение, это должно решить вашу проблему.

0 голосов
/ 25 марта 2010

Вот как я это сделал:

  1. В список стоп-слов добавлены общие термины, такие как «Университет», «Школа», «Медицина», «Институт» и т. Д.

  2. Использовал логический запрос для каждого из терминов, а setMinimumNumberShouldMatch () равнялся 75% длины строки запроса.

Наконец, переберите коллектор совпадений и используйте алгоритм сравнения строк, такой как Jaro-Winkler, Levenstein и т. Д. Для фильтра второго уровня. (это медленно, но обеспечивает точность).

Надеюсь, это поможет.

...