2011-09-11 3 views
0

namedescriptionを持つモデルがあります。ユーザーが名前またはdescriptionのstringの一部を検索できるようにする必要があります.SQLクエリを使用してこれを行う代わりに、私はplayframeworkのためにインストールできるsearchモジュールを使用すると考えました。私はこのplayframeworkの検索モジュールを使用して、適切な

ようなSQLクエリを使用している場合

検索モジュールのドキュメントを見てみると

、私はapplication.confで

@Entity 
@Indexed 
class Item{ 

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

    public Date creationDate; 
    ... 
... 
} 

モデルにこれらの注釈を入れて、私は

play.search.reindex=enabled 

を設定しました

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; 
} 

これは正しく動作し、入力文字列が大文字または小文字の場合などを処理します。また、 tは

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

検索モジュールはLuceneに基づいています。デフォルトでは、Luceneは単語全体を検索します。あなたのフィールドに「java」という言葉が一切ないので、何も見つかりませんでした。 ワイルドカードを使用すると、たとえばname:java* OR description:java*のようなニーズに合わせることができます。あなたはより多くの例を見つけることができthereキーワードはどこにも発見される場合

関連する問題