Поиск в спящем режиме: нетексированный запрос - PullRequest
0 голосов
/ 13 января 2011

Я использую Hibernate Search.Проблема в том, что, когда я выполняю поиск этой строки:

"l"

У меня нет результатов ... Если я попробую с этим ...

"l *"

результат:

"Lampada bla bla" "Lampione bla bla bla" "Lost"

Это моё pojo

@Id @GeneratedValue
@DocumentId
private Long id;

@Field(index=Index.TOKENIZED, store=Store.YES )
private String nome;

@Field(index=Index.TOKENIZED,store=Store.YES, termVector=TermVector.YES)
private String descrizione;

@Column(length=30)
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}

@Column(length=100)
public String getDescrizione() {
    return descrizione;
}
public void setDescrizione(String descrizione) {
    this.descrizione = descrizione;
}
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}

@Override
public String toString() {
    return String.format("(%s) %s: %s", id, nome, descrizione);
}

Это мой класс Java:

Session session = super.session();
    List result = new ArrayList();
    luceneSession = Search.getFullTextSession(session);

    String[] fields = (String[]) boostsNField.keySet().toArray(new String[boostsNField.keySet().size()]);

    QueryParser parser =  new MultiFieldQueryParser(Version.LUCENE_30, fields, new StandardAnalyzer(Version.LUCENE_30), boostsNField);
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);


    try {
        Query luceneQuery = parser.parse(queryString);
        org.hibernate.Query fullTextQuery = luceneSession.createFullTextQuery( luceneQuery ); // E' possibile scegliere impostare il class da ricercare
        result = fullTextQuery.list();

    } catch (ParseException e) {

В чем проблема ??!?!?

1 Ответ

1 голос
/ 13 января 2011

Возможно, вы используете StandardAnalyzer для индексирования документов. Как говорит Javadoc, он использует StandarkTokenizer . Этот токенизатор извлекает слова из текста и обрабатывает их с помощью нескольких простых правил (читайте javadoc). затем происходит некоторая фильтрация токенов, но обычно слово становится токеном.

Я не знаю деталей, но я думаю, что при поиске lucene сравнивает / ищет токены (слова в вашем случае), поэтому запрос "l" приводит к пустому списку, потому что токен "l" не совпадает с Жетон "Лампада".

Если вы хотите искать в своем индексе, используя любую подстроку проиндексированных документов, вам следует рассмотреть возможность использования / записи токенизатора на основе ngrams (). Для каждой возможной подстроки данной строки она создает токен. Имея в качестве строки "Lampada", он будет производить "L", "La", "Lam", ..., "ada", "da", "a", а затем даже при выполнении запроса LuceneIndex с помощью StandardTokenizer и query = "l «вы найдете соответствующие документы (имейте в виду, что этот подход увеличивает скорость, с которой растет индекс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...