У меня есть запрос, который нужно будет запускать 28 000 раз подряд, поэтому я подумал, что использование prepareStatement, вероятно, является умной идеей.
Вот мой запрос:
String requestWithFirstName = "SELECT SE.ELEMENT_ID, SE.LASTNAME||' '||SE.FIRSTNAME AS ELEMENT, (SCORE(1)+SCORE(2))/2 AS SCORE "
+ "FROM BL_SUSPICIOUS_ELEMENT SE "
+ "WHERE CONTAINS(SE.LASTNAME, 'fuzzy({' || ? || '},' || ? || ',' || ? || ', weight)' , 1)>0 "
+ "AND CONTAINS(SE.FIRSTNAME, 'fuzzy({' || ? || '},' || ? || ',' || ? || ', weight)' , 2)>0 "
+ (type > 0 ? "AND SE.ELEMENT_TYPE_ID = ?" : "")
+ " ORDER BY SCORE DESC";
Everthings работали хорошо, пока мы не поняли, что нечеткие методы не работают хорошо для расщепленных слов, таких как «Пикачу - мой герой», и рекомендуется создать, в данном случае, 4 нечетких поиска «Пикачу», «есть». мой герой'. Не уверен, что это правда, но поскольку я выполню запрос 28 000 раз, это хорошая возможность увидеть его в действии.
Поэтому я попытался изменить запрос следующим образом:
"SELECT A.ELEMENT_ID, A.LASTNAME||' '||A.FIRSTNAME AS AKA, SCORE(1) AS SCORE "
+ "FROM BL_AKA A, BL_SUSPICIOUS_ELEMENT SE "
+ "WHERE CONTAINS(A.LASTNAME, ?, 1)>0 "
+ "AND SE.ELEMENT_ID = A.ELEMENT_ID "
+ (type > 0 ? "AND SE.ELEMENT_TYPE_ID = ?": "")
+ " ORDER BY SCORE DESC";
В этом случае? будет установлен на:
нечеткий ({Бернхем}, 70,4, вес), нечеткий ({} Инвесторы, 70,4, вес), нечеткий ({трест}, 70,4, вес) '
Запрос выглядит нормально, работает на sql dev. Однако с Java я получаю следующую ошибку:
ORA-20000: ошибка Oracle Text:
DRG-50900: ошибка синтаксического анализатора текстовых запросов в строке 1, столбец 30
DRG-50920: часть фразы, а не фраза или эквивалентность
DRG-50900: ошибка синтаксического анализатора текстовых запросов в строке 1, столбец 30
DRG-50920: часть фразы сама по себе не является фразой или эквивалентностью
Есть совет?
Интересно, это та же самая ситуация, что и в выражении in (невозможно создать select * from pokemon, где monster in (?))
Спасибо!