在playframework中使用搜索模块,正确

发布于 2024-12-04 12:30:55 字数 1704 浏览 2 评论 0原文

我有一个模型 Item,它有 namedescription。我需要允许用户在名称或描述中搜索字符串的一部分我没有使用 sql 查询来执行此操作,而是考虑使用可以为 playframework 安装的 search 模块。

查看搜索模块的文档,我将这些注释添加到模型

@Entity
@Indexed
class Item{

   @Field
   public String name;
   @Field
   public String description;

   public Date creationDate;
   ...
 ...
}

中,在 application.conf 中,我设置了

play.search.reindex=enabled

如果我使用这样的 sql 查询,

public static List<Item> getSearchResults(String kw){
    List<Item> items = null;
    if(kw!=null && kw.length()>0) {
        String trimkw = kw.trim().toLowerCase();
        String pattern = "%"+trimkw+"%";
        String query="select distinct b from Item b where (lower(name) like :pattern or lower(description) like :pattern)";
        items = Item.find(query).bind("pattern", pattern).fetch();
        System.out.println("getSearchResults():: items="+items.size());
    }
    return items;
}

这可以正常工作,并处理输入字符串为大写或小写等的情况。获取部分字符串的结果.. 例如,

I have items JavaRing ,Android
when the kw="JAvA"
the search returns a list containing JavaRing

我尝试使用这样的搜索模块

import play.modules.search.Search;
import play.modules.search.Query;
...
String qstr = "name:"+trimkw+" OR description:"+trimkw;
System.out.println("query string="+qstr);
Query q = Search.search(qstr, Item.class);
items = q.fetch();
System.out.println("items="+items.size());

,但这会返回与我在上一个案例中使用的相同关键字的空列表。

keyword = "JAvA"
query string=name:java OR description:java
items=0

我编码搜索字符串的方式有问题吗?

I have a model Item that has a name and description.I need to allow the user to search for a part of string in name or description.Instead of doing this using an sql query,I thought of using the search module that can be installed for playframework.

Looking at the documentation for search module ,I put these annotations to the model

@Entity
@Indexed
class Item{

   @Field
   public String name;
   @Field
   public String description;

   public Date creationDate;
   ...
 ...
}

In application.conf ,I set

play.search.reindex=enabled

If I use an sql query like this

public static List<Item> getSearchResults(String kw){
    List<Item> items = null;
    if(kw!=null && kw.length()>0) {
        String trimkw = kw.trim().toLowerCase();
        String pattern = "%"+trimkw+"%";
        String query="select distinct b from Item b where (lower(name) like :pattern or lower(description) like :pattern)";
        items = Item.find(query).bind("pattern", pattern).fetch();
        System.out.println("getSearchResults():: items="+items.size());
    }
    return items;
}

This works properly,and handles the cases where input string is uppercase or lowercase etc.Also it will get results for partial strings ..
For example ,

I have items JavaRing ,Android
when the kw="JAvA"
the search returns a list containing JavaRing

I tried using Search module like this

import play.modules.search.Search;
import play.modules.search.Query;
...
String qstr = "name:"+trimkw+" OR description:"+trimkw;
System.out.println("query string="+qstr);
Query q = Search.search(qstr, Item.class);
items = q.fetch();
System.out.println("items="+items.size());

But this returns an empty list for the same keyword as I used in the previous case.

keyword = "JAvA"
query string=name:java OR description:java
items=0

Is there something wrong with the way I have coded the search string?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

落日海湾 2024-12-11 12:30:55

搜索模块基于Lucene。默认情况下,Lucene 搜索整个单词。您没有找到任何内容,因为您的字段中没有完整的单词“java”。
使用通配符,例如 name:java* OR description:java* 您将满足您的需求。您可以在那里找到更多示例

Search module is based on Lucene. By default, Lucene searches for whole words. You didn't find anything because there isn't whole word 'java' in your fields.
Using wildcards, for instance name:java* OR description:java* you'll fit your needs. You can find more examples there

多情癖 2024-12-11 12:30:55

更新的链接是 http://lucene.apache.org/java/3_0_2/queryparsersyntax.html< /a>

在这种情况下,如果要在任何地方找到关键字,我假设字符串模式需要从 % 修改为 *.

即。 String pattern = trimkw+"*";

代码的其余部分可以保持不变。

Updated link is http://lucene.apache.org/java/3_0_2/queryparsersyntax.html

In this case, if the keyword is to be found anywhere, I assume string pattern needs to be modified from % to *.

ie. String pattern = trimkw+"*";

The rest of the code could remain the same.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文