Программа, которую я написал несколько лет назад, использует 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?