Java Play框架:使用ebean orm实现全文搜索的最佳方式,因为@Index不起作用

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)

我现在正在为大学做一个项目,在那里我正在使用这个剧本!框架2.4与Ebean一起

目前,我正在尝试实现实时用户搜索,用户可以使用全文输入搜索其他用户。一个可能的搜索字符串可以是“Michael Lee”或只是一个电子邮件地址。我将搜索字符串传递给此方法,在此方法中,我尝试以智能方式访问数据库:

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;