Java Play框架:使用ebean orm实现全文搜索的最佳方式,因为@Index不起作用
我现在正在为大学做一个项目,在那里我正在使用这个剧本!框架2.4与Ebean一起 目前,我正在尝试实现实时用户搜索,用户可以使用全文输入搜索其他用户。一个可能的搜索字符串可以是“Michael Lee”或只是一个电子邮件地址。我将搜索字符串传递给此方法,在此方法中,我尝试以智能方式访问数据库:Java Play框架:使用ebean orm实现全文搜索的最佳方式,因为@Index不起作用,java,mysql,playframework,ebean,Java,Mysql,Playframework,Ebean,我现在正在为大学做一个项目,在那里我正在使用这个剧本!框架2.4与Ebean一起 目前,我正在尝试实现实时用户搜索,用户可以使用全文输入搜索其他用户。一个可能的搜索字符串可以是“Michael Lee”或只是一个电子邮件地址。我将搜索字符串传递给此方法,在此方法中,我尝试以智能方式访问数据库: public Result searchUser(String sstring) { String query = "WHERE MATCH (firstname,lastname,email)
public Result searchUser(String sstring) {
String query = "WHERE MATCH (firstname,lastname,email) AGAINST ('" + sstring + "' IN BOOLEAN MODE)";
List<User> resultUsers = User.find
.setQuery(query)
.findList();
String resultString = "";
for (User user: resultUsers) {
resultString += user.getFirstname() + user.getLastname() + "<br>";
}
return ok(resultString);
}
那我还能做什么呢?可以在外部设置此索引吗?可能是在第二个不是自动生成的演进文件中设置吗?我找到了一个使用play framework演进的解决方案。Ebean正在自动创建第一个名为1.sql的进化文件,其中包含数据库模式的完整创建 对于我的
用户
表,UP部分如下所示:
create table users (
id bigint auto_increment not null,
firstname varchar(45),
lastname varchar(45),
birthday datetime,
email varchar(60),
password varchar(32),
author tinyint(1) default 0,
points integer,
locked tinyint(1) default 0,
last_online datetime,
date_created datetime not null,
date_updated datetime not null,
constraint uq_users_email unique (email),
constraint pk_users primary key (id)
);
如您所见,没有创建全文索引
我所做的是创建第二个evolution文件2.sql。这会将全文
索引添加到用户
表中
# --- !Ups
create fulltext index livesearch_index on users (firstname,lastname,email);
# --- !Downs
drop index livesearch_index on users;
我知道这不是最好的解决办法,但它是可行的。我仍然感兴趣的是其他人如何解决这个问题,或者您使用哪种解决方案进行全文搜索。您的解决方案实际上很好。这是处理模式演变的正确方法
我通常做的是在开发过程中启用evolutions插件,然后在应用程序准备就绪时禁用它-这样,您将只拥有1.sql
-至少直到您收到另一个更改请求并决定更新架构。更多信息请点击此处:
除此之外,还有一件事你应该考虑——数据库在搜索方面很差,尤其是在文本搜索时。几个月前,我处于一个类似的位置,因为我需要实现这样的功能(请参阅)。为了腾出时间阅读:我最终使用ElasticSearch来处理所有与搜索相关的功能(全文、聚合等),我并不后悔!我知道这对你的大学项目来说可能是一种过度的杀伤力,但在现实世界中,你不想使用你的数据库进行全文搜索。也许我确实理解了一些错误,但是每次我在模型中更改某些内容时,ebean不是都在生成1.sql吗?显然,没有任何注释可以告诉ebean创建全文索引。如果我自己在1.sql文件中编写索引,那么下次我在模型中更改某些内容时可能会被重写?所以我必须在这里使用第二个evolution文件,对吗?当然,您可以将全文索引的创建直接放入1.sql
-只要确保您已禁用evolution文件的自动创建。然后,如果以后有模型更改,则需要创建2.sql
。
# --- !Ups
create fulltext index livesearch_index on users (firstname,lastname,email);
# --- !Downs
drop index livesearch_index on users;