From f55c6aa23b575af05c22f1f3ee06ac72b851e0e1 Mon Sep 17 00:00:00 2001 From: Takiguchi Date: Sun, 20 May 2018 23:54:31 +0200 Subject: [PATCH] Add unaccent postgresql function in search engine. --- pom.xml | 6 ++++++ .../repositories/PostSearchRepositoryImpl.java | 16 ++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 6080791..9a704b4 100755 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,12 @@ commons-lang 2.3 + + + org.apache.commons + commons-lang3 + 3.7 + diff --git a/src/main/java/org/codiki/core/repositories/PostSearchRepositoryImpl.java b/src/main/java/org/codiki/core/repositories/PostSearchRepositoryImpl.java index 2548b2e..0f8784e 100755 --- a/src/main/java/org/codiki/core/repositories/PostSearchRepositoryImpl.java +++ b/src/main/java/org/codiki/core/repositories/PostSearchRepositoryImpl.java @@ -22,7 +22,7 @@ public class PostSearchRepositoryImpl implements PostSearchRepository { final String queryStr = buildSearchQuery(pCriterias); try { - final Query query = em.createQuery(queryStr); + final Query query = em.createNativeQuery(queryStr, Post.class); for(int i = 1 ; i <= pCriterias.length ; i++) { query.setParameter(StringUtils.concat("c", i), StringUtils.concat('%', pCriterias[i - 1].toLowerCase(), '%')); } @@ -35,15 +35,15 @@ public class PostSearchRepositoryImpl implements PostSearchRepository { } protected String buildSearchQuery(final String[] pCriterias) { - final StringBuilder result = new StringBuilder("SELECT p FROM Post p JOIN FETCH p.category JOIN FETCH p.author "); + final StringBuilder result = new StringBuilder("SELECT * FROM post p INNER JOIN category c ON c.id = category_id INNER JOIN \"user\" u ON u.id = p.creator_id "); for(int i = 1 ; i <= pCriterias.length ; i++) { - result.append(StringUtils.concat((i == 1) ? "WHERE" : "OR", " LOWER(p.title) LIKE :c", i, - " OR LOWER(p.description) LIKE :c", i, - " OR LOWER(p.text) LIKE :c", i, - " OR LOWER(p.category.name) LIKE :c", i, - " OR LOWER(p.author.name) LIKE :c", i, - " OR LOWER(p.author.email) LIKE :c", i, " ")); + result.append(StringUtils.concat((i == 1) ? "WHERE" : "OR", " UNACCENT(p.title) ILIKE UNACCENT(:c", i, ")", + " OR UNACCENT(p.description) ILIKE UNACCENT(:c", i, ")", + " OR UNACCENT(p.text) ILIKE UNACCENT(:c", i, ")", + " OR UNACCENT(c.name) ILIKE UNACCENT(:c", i, ")", + " OR UNACCENT(u.name) ILIKE UNACCENT(:c", i, ")", + " OR UNACCENT(u.email) ILIKE UNACCENT(:c", i, ") ")); } return result.toString();