所以我有一个数据库,里面有文章,用户应该能够搜索他们输入的关键字,搜索应该能找到任何包含这个词的文章。
因此,例如,如果有人要搜索阿尔茨海默氏症这个词,我会希望它以任何方式返回带有拼写的文章,而不管它的撇号是什么;
阿尔茨海默氏症
阿尔茨海默病
结果应全部返回。在这一分钟,它是搜索准确的方式,这个词是拼写,不会带来结果,如果它有标点符号。
因此,我现在要查询的是:
private static final String QUERY_FIND_BY_SEARCH_TEXT = "SELECT o FROM EmailArticle o where UPPER(o.headline) LIKE :headline OR UPPER(o.implication) LIKE :implication OR UPPER(o.summary) LIKE :summary";用户的输入称为“searchText”,它来自输入框。
public static List<EmailArticle> findAllEmailArticlesByHeadlineOrSummaryOrImplication(String searchText) {
Query query = entityManager().createQuery(QUERY_FIND_BY_SEARCH_TEXT, EmailArticle.class);
String searchTextUpperCase = "%" + searchText.toUpperCase() + "%";
query.setParameter("headline", searchTextUpperCase);
query.setParameter("implication", searchTextUpperCase);
query.setParameter("summary", searchTextUpperCase);
List<EmailArticle> emailArticles = query.getResultList();
return emailArticles;
}所以我想把所有的结果带回阿尔茨海默氏症,不管他们是否是一个撇号。我想我已经提供了足够的信息,但是如果你需要更多的话,就直说吧。不太清楚该如何使用它,是否可以替换/删除用户搜索中的所有标点符号或撇号?
发布于 2022-05-01 09:56:04
在我看来,您应该更改查询,应该添加alter表,并向列中添加FULLTEXT索引(标题、含义、摘要)。
您还应该使用MATCH-AGAINST,而不是使用LIKE查询,最重要的是,阅读SOUNDEX()语法,非常漂亮的语法。
我只能给您提供一个本机查询示例:
SELECT o.* FROM email_article o WHERE MATCH(o.headline, o.implication, o.summary) AGAINST('your-text') OR SOUNDEX(o.headline) LIKE SOUNDEX('your-text') OR SOUNDEX(o.implication) LIKE SOUNDEX('your-text') OR SOUNDEX(o.summary) LIKE SOUNDEX('your-text') ;
虽然它不会给你像谷歌搜索那样的结果,但它在某种程度上是有效的。让我知道你的想法。
https://stackoverflow.com/questions/22220973
复制相似问题