在play框架中使用搜索模块,正确

时间:2011-09-11 15:02:47

标签: java search module lucene playframework

我的模型Itemnamedescription。我需要允许用户在名称或描述中搜索字符串的一部分。而不是使用一个sql查询,我想到了可以为search安装的playframework模块。

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

@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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

更新后的链接为http://lucene.apache.org/java/3_0_2/queryparsersyntax.html

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

即。 String pattern = trimkw+"*";

其余代码可以保持不变。