Как выполнить полнотекстовый поиск после обновления H2 и Lucene - PullRequest
0 голосов
/ 26 мая 2019

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

Вот тест, который иллюстрирует проблему.Он взят из учебника H2 по полнотекстовому поиску здесь .Я попытался сделать этот тест как можно ближе к исходному примеру, поэтому он не очень идиоматичен.

(deftest ftl-setup-test
  (testing "The ability to setup and use full text search with the H2 database 1.4.198 and later")

  ;; Delete any pre-existing versions of the test database files and
  ;; directories. Then make sure the needed parent directories are present.
  (delete-parent (get-test-db-file-name))
  (make-parents (get-test-db-file-name))

  (let [db-spec (get-test-db-spec)]
    (jdbc/execute! db-spec ["CREATE ALIAS IF NOT EXISTS FTL_INIT FOR \"org.h2.fulltext.FullTextLucene.init\""])
    (jdbc/execute! db-spec ["CALL FTL_INIT()"])
    (jdbc/execute! db-spec ["DROP TABLE IF EXISTS TEST"])
    (jdbc/execute! db-spec ["CREATE TABLE TEST(ID INT PRIMARY KEY, FIRST_NAME VARCHAR, LAST_NAME VARCHAR)"])
    (jdbc/execute! db-spec ["CALL FTL_CREATE_INDEX('PUBLIC', 'TEST', NULL)"])
    (jdbc/execute! db-spec ["INSERT INTO TEST VALUES(1, 'John', 'Wayne')"])
    (jdbc/execute! db-spec ["INSERT INTO TEST VALUES(2, 'Elton', 'John')"])
    (is (= 2 (count (jdbc/query db-spec ["SELECT * FROM FTL_SEARCH_DATA('John', 0, 0)"]))))
    (is (= 1 (count (jdbc/query db-spec ["SELECT * FROM FTL_SEARCH_DATA('LAST_NAME:John', 0, 0)"]))))
    (jdbc/execute! db-spec ["CALL FTL_DROP_ALL()"])))

Когда тест запускается с программой, созданной с версией H2 1.4.197 иLucene версии 3.6.2, ожидаемый результат сообщается:

$ lein test cwiki.test.models.h2-upgrade
...

Ran 1 tests containing 2 assertions.
0 failures, 0 errors.

Когда зависимости в файле проекта изменяются на H2 версии 1.4.198 (или 1.4.199) и Lucene версии 7.7.1 (или5.5.5), ошибки появляются, как в следующей отредактированной трассировке стека.

$ lein test cwiki.test.models.h2-upgrade
...
ERROR in (ftl-setup-test) (DbException.java:573)
Uncaught exception, not in assertion.
expected: nil
  actual: org.h2.jdbc.JdbcSQLSyntaxErrorException: Error creating or initializing trigger "FTL_TEST" object, class "org.h2.fulltext.FullTextLucene$FullTextTrigger", cause: "java.lang.reflect.InvocationTargetException"; see root cause for details; SQL statement:
CREATE TRIGGER IF NOT EXISTS "PUBLIC"."FTL_TEST" AFTER INSERT, UPDATE, DELETE, ROLLBACK ON "PUBLIC"."TEST" FOR EACH ROW CALL "org.h2.fulltext.FullTextLucene$FullTextTrigger" [90043-198]
 at org.h2.message.DbException.getJdbcSQLException (DbException.java:573)
 ...
 Caused by: java.lang.reflect.InvocationTargetException: null
 at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0 (NativeConstructorAccessorImpl.java:-2)
 ...
 Caused by: java.lang.NoSuchMethodError: org.apache.lucene.document.FieldType.<init>(Lorg/apache/lucene/document/FieldType;)V
 at org.h2.fulltext.FullTextLucene$FullTextTrigger.<init> (FullTextLucene.java:503)
 ...

Ran 1 tests containing 1 assertions.
0 failures, 1 errors.
Tests failed.

Другие модульные тесты с данными H2 работают, как и ожидалось, с обновлением.Это не только часть полнотекстового поиска моей программы.

Я посмотрел исходный код для упомянутых классов H2 и Lucene, но не вижу проблемы.

Эти тесты были запущены с Clojure 1.10.0 на Java 11.0.2.

Итак, есть ли идеи о том, как я могу снова выполнить полнотекстовый поиск после обновления H2 и Lucene?

...