[英]using search module in playframework,proper
我有一個模型Item
,有一個name
和description
。我需要讓用戶搜索字符串的名稱或做這個使用SQL查詢的description.Instead的一部分,我想用的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
我對搜索字符串進行編碼的方式有問題嗎?
搜索模塊基於Lucene。 默認情況下,Lucene搜索整個單詞。 您沒有找到任何東西,因為您的字段中沒有完整的單詞“ java”。 使用通配符(例如name:java* OR description:java*
可以滿足您的需求。 您可以在此處找到更多示例
更新的鏈接是http://lucene.apache.org/java/3_0_2/queryparsersyntax.html
在這種情況下,如果在任何地方都可以找到關鍵字,則我認為字符串模式需要從%
修改為*.
即。 String pattern = trimkw+"*";
其余代碼可以保持不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.