我的模型Item
有name
和description
。我需要允许用户在名称或描述中搜索字符串的一部分。而不是使用一个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
我编码搜索字符串的方式有问题吗?
答案 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+"*";
其余代码可以保持不变。