Почему Lucene иногда не соответствует InChIKeys? - PullRequest
2 голосов
/ 29 марта 2011

Я проиндексировал свою базу данных с помощью Hibernate Search. Я использую собственный анализатор, как для индексации, так и для запросов. У меня есть поле под названием Inchikey, которое не должно быть размечено. Пример значения:

  • BBBAWACESCACAP-UHFFFAOYSA-N
  • KEZLDSPIRVZOKZ-AUWJEWJLSA-N

Когда я просматриваю свой индекс с Люком, я могу подтвердить, что они не являются токенизированными, как требуется.

Однако, когда я пытаюсь найти их с помощью веб-приложения, некоторые дюймовые ключи обнаруживаются, а другие нет. Любопытно, что для этих дюймов, поиск работает, когда я ищу без последнего дефиса, например: BBBAWACESCACAP-UHFFFAOYSA N

Мне не удалось найти общий элемент в дюймах, которые не были найдены.

Есть идеи, что здесь происходит?

Я использую MultiFieldQueryParser для поиска по различным полям в базе данных:

    String[] searchfields = Compound.getSearchfields();
    MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_29, Compound.getSearchfields(), new ChemicalNameAnalyzer());
    //Disable the following if search performance is too slow
    parser.setAllowLeadingWildcard(true);
    FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(parser.parse("searchterms"), Compound.class);
    List<Compound> hits = fullTextQuery.list();

Более подробную информацию о нашей настройке выложили здесь Тим и я.

1 Ответ

2 голосов
/ 30 марта 2011

Оказывается, что последние записи во входном файле не индексируются правильно. Эти токены. На самом деле кажется, что они индексируются дважды: один раз без токенизации и один раз с. Когда я ищу, я не могу найти неотмеченный.

Я еще не нашел причину, но я думаю, что это, возможно, связано с завершением нашего синтаксического анализатора, когда Lucene все еще индексирует последние записи, и в результате Lucene возвращается к анализатору по умолчанию (StandardAnalyzer). Когда я найду виновного, я сообщу здесь.

Добавление @Analyzer (impl = ChemicalNameAnalyzer.class) к полям решает проблему, но мне нужна моя исходная установка с анализатором по умолчанию, определенным один раз в конфигурации, например:

<property name="hibernate.search.analyzer">path.to.ChemicalNameAnalyzer</property>
...