использование модуля поиска в playframework, собственно - PullRequest
0 голосов
/ 11 сентября 2011

У меня есть модель 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

Что-то не так с тем, как я кодировал строку поиска?

Ответы [ 2 ]

0 голосов
/ 03 января 2012

Обновлена ​​ссылка http://lucene.apache.org/java/3_0_2/queryparsersyntax.html

В этом случае, если ключевое слово нужно найти где-либо, я предполагаю, что строковый шаблон необходимо изменить с % на *.

то есть.String pattern = trimkw+"*";

Остальная часть кода может остаться прежней.

0 голосов
/ 24 сентября 2011

Модуль поиска основан на Lucene. По умолчанию Lucene ищет целые слова. Вы ничего не нашли, потому что в ваших полях нет целого слова «java». Используя подстановочные знаки, например name:java* OR description:java*, вы будете соответствовать вашим потребностям. Вы можете найти больше примеров там

...