Запрос JPA Select не возвращает результаты с одним буквенным словом

У меня есть запрос, который при вводе слова, начинающегося с однобуквенного слова, за которым следует пробел, а затем еще одно слово (например, «T-распределение»), не возвращает результатов. Хотя задано только «Распределение», возвращаются результаты, включая результаты для «Т-распределения». То же самое со всеми условиями поиска, начинающимися с однобуквенного слова, за которым следует пробел, а затем еще одно слово.

Проблема возникает, когда поисковый запрос имеет следующий шаблон: «[одна буква] [пробел] [буква / слово]». пример: «уплотнительное кольцо».

В чем проблема, если в этом случае оператор LIKE работает некорректно?

Вот мой запрос:

@Cacheable(value = "filteredConcept")
@Query("SELECT NEW sina.backend.data.model.ConceptSummaryVer04(s.id, s.arabicGloss, s.englishGloss, s.example, s.dataSourceId,
s.synsetFrequnecy, s.arabicWordsCache, s.englishWordsCache, s.superId, s.categoryId, s.dataSourceCacheAr, s.dataSourceCacheEn,
s.superTypeCasheAr, s.superTypeCasheEn, s.area, s.era, s.rank, s.undiacritizedArabicWordsCache, s.normalizedEnglishWordsCache, 
s.isTranslation, s.isGloss, s.arabicSynonymsCount, s.englishSynonymsCount) FROM Concept s 
where s.undiacritizedArabicWordsCache LIKE %:searchTerm% AND data_source_id != 200 AND data_source_id != 31")
List<ConceptSummaryVer04> findByArabicWordsCacheAndNotConcept(@Param("searchTerm") String searchTerm, Sort sort);

результат запроса к самой базе данных: ссылка на скриншот

результаты в базе данных возвращаются независимо от регистра букв: ссылка на скриншот

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
123
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте цитаты:

 LIKE '%:searchTerm%'; 

вы вообще получаете какую-либо ошибку? или просто набор результатов не возвращает то, что вы ожидаете?

мυѕτавєւмo 11.06.2018 11:33

Хорошо, обратите внимание, что в ваших данных должны быть записи, для которых это поле похоже на %T Distribution%, есть ли у вас данные, подтверждающие это?

мυѕτавєւмo 11.06.2018 11:35

У меня есть. Я попытался напрямую запросить базу данных, и она там. Кроме того, если я искал термин «Распространение» с помощью веб-сайта, он возвращает результаты, включая результаты для «Распределение T». Так что определенно он есть в базе данных.

Hamzeh 11.06.2018 11:38

хорошо, это странно, попробуйте выполнить свой запрос, указав T D в качестве поискового запроса

мυѕτавєւмo 11.06.2018 11:40

нет результатов, поиск "T D". Я заметил, что это происходит, когда искомый термин выглядит следующим образом: «<одна буква> <пробел> <буква / слово>»

Hamzeh 11.06.2018 11:43

даже с кавычками?

мυѕτавєւмo 11.06.2018 11:43

Однако, когда я ищу "T", он возвращает результаты для "T Distribution". Странный. Не так ли?

Hamzeh 11.06.2018 11:43

Даже с цитатами.

Hamzeh 11.06.2018 11:44

попробуйте использовать подчеркивание "_%", затем пробел, а затем символ процента в вашем поисковом выражении, что даст вам все слова, содержащие одну букву, за которой следует пробел, а затем некоторое слово

saurabh kedia 11.06.2018 11:45

Хорошо, попробуйте изменить запрос: удалите из него подстановочные знаки и передайте выражение Entrie с подстановочными знаками при его вызове, LIKE ':searchTerm', и вызовите его как этот findByArabicWordsCacheAndNotConcept("%T Distribution%");

мυѕτавєւмo 11.06.2018 11:49

Я попробовал "_%", он вернул ошибку: java.lang.IllegalArgumentException: параметр с этой позицией [1] не существует

Hamzeh 11.06.2018 11:50

Я попытался передать подстановочные знаки с выражением. не сработало. даже для таких слов, как «время», с которыми раньше не было проблем.

Hamzeh 11.06.2018 11:54

Просто предоставьте снимок экрана своей таблицы, особенно этого странного столбца

мυѕτавєւмo 11.06.2018 11:56

Добавил к вопросу скриншот.

Hamzeh 11.06.2018 12:00

Хорошо, я вижу, что это просто вопрос, чувствительный к регистру, T Distribution - это не то же самое, что t Distribution

мυѕτавєւмo 11.06.2018 12:01

Если вы хотите игнорировать регистры, просто добавьте агрегатор ключевых слов в верхнем регистре: ... where UPPER(s.undiacritizedArabicWordsCache) LIKE UPPER('%:searchTerm%')

мυѕτавєւмo 11.06.2018 12:05

Пробовал. тоже не сработало. кроме того, LIKE не учитывал регистр в самой базе данных. См. Приложенный снимок экрана.

Hamzeh 11.06.2018 12:14

да. всевозможные формы. Нет результатов. то же самое поведение и для других терминов, таких как «o группа», «o уровень», «уплотнительное кольцо», которые все в нижнем регистре как в базе данных, так и в поисковом запросе. Никаких результатов тоже. проблема в шаблоне: <одна буква> <пробел> <буква / слово>

Hamzeh 11.06.2018 12:21

Это так странно

мυѕτавєւмo 11.06.2018 12:33

Установите searchTerm = "%your_word%" и используйте его в таком запросе:

... s.undiacritizedArabicWordsCache LIKE :searchTerm ...

Вы уверены, что это космический символ? Это может быть другой символ (\ t, \ n и т. д.)

Arif Ulusoy 11.06.2018 13:29

Я очень уверен. это пространство как в базе данных, так и в искомом термине.

Hamzeh 11.06.2018 13:32

Можете ли вы напечатать длину запрашиваемого столбца в sql-запросе на скриншотах. Я все еще думаю, что могут быть лишние непечатаемые символы. Также запросы к скриншотам с использованием английского столбца, но столбец с вопросом на арабском языке.

Arif Ulusoy 11.06.2018 13:53
Ответ принят как подходящий

Я решил эту проблему. Это произошло из-за конфигурации по умолчанию полнотекстового индекса в базе данных mysql, которая по умолчанию установлена ​​на 2 (ft_min_word_len = 2).

Я изменил это и перестроил index. Затем по запросу были возвращены однобуквенные слова.

12.9.6 Тонкая настройка полнотекстового поиска MySQL

Другие вопросы по теме