У меня есть модель 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
Что-то не так с тем, как я кодировал строку поиска?