Как сделать поиск части слова, используя lucene? - PullRequest
1 голос
/ 09 июня 2009

Здесь Ершад. Я работаю над люценом. Теперь я могу искать слово. Но если я наберу часть слова, я не могу получить результаты. Можете ли вы предложить, что делать.

Для индексации я использую код ниже

writer = new IndexWriter(directory, new StandardAnalyzer(), true);
writer.SetUseCompoundFile(true);

doc.Add(Field.UnStored("text", parseHtml(html)));
doc.Add(Field.Keyword("path", relativePath));
writer.AddDocument(doc);

Для поиска я использую приведенный ниже код.

Query query = QueryParser.Parse(this.Query,"text",new StandardAnalyzer());

// create the result DataTable
this.Results.Columns.Add("title", typeof(string));
this.Results.Columns.Add("sample", typeof(string));
this.Results.Columns.Add("path", typeof(string));

// search
Hits hits = searcher.Search(query);

this.total = hits.Length();

1 Ответ

6 голосов
/ 09 июня 2009

Если вы обратитесь к документации по синтаксису синтаксического анализатора запросов Lucene , вы обнаружите, что можете добавить звездочку (*) в конец вашего запроса, чтобы соответствовать всем тем словам, которые начинаются с определенного строка. Например, предположим, что вы хотите получить результаты с упоминанием как «гусеница», так и «катамаран». Ваш поисковый запрос будет "cat *".

Однако, если вы не управляете поисковым запросом напрямую (например, если пользователь вводит свои собственные поисковые запросы), вам может потребоваться небольшая хитрость со стороны QueryParser. Мой опыт связан исключительно с Java-версией Lucene. Надеюсь, что с Lucene.NET принципы совпадают.

В Java вы можете расширить класс QueryParser и переопределить его метод newTermQuery(Term). Традиционно этот метод возвращает объект TermQuery. Однако дочерний класс вместо этого вернет PrefixQuery. Например:

public class PrefixedTermsQueryParser extends QueryParser {

    // Some constructors...

    protected Query newTermQuery(Term term) {
        return new PrefixQuery(term);
    }

}

Я не совсем уверен, какие методы вы можете переопределить в Lucene.NET, но я уверен, что должно быть что-то подобное. Глядя на его документацию , он показывает, что класс QueryParser имеет метод с именем GetFieldQuery. Возможно, это тот метод, который вам придется переопределить.

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