簡體   English   中英

在playframework中使用搜索模塊,正確

[英]using search module in playframework,proper

我有一個模型Item ,有一個namedescription 。我需要讓用戶搜索字符串的名稱或做這個使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM