Управление запросом Lucene перед выполнением поиска - PullRequest
4 голосов
/ 18 ноября 2011

Я работаю над веб-приложением Java (Spring 3.x), которое использует SOLR для своей поисковой системы.Я хочу иметь возможность перехватить запрос Lucene и заменить «виртуальное» поле поиска одним из двух проиндексированных полей на основе службы поиска (в случае успеха используйте поиск по диапазону, в противном случае ищите обычное поле).

Например, учитывая запрос типа field0:foo (field1:bar OR field1:bash) AND field2:bing (field1 является виртуальным полем)

манипулируйте запросом, чтобы получить field0:foo (field3:[42 TO 45] OR field4:bash) AND field2:bing

Так что после игры с идеей просто использовать reg ex,Я решил посмотреть на классы Lucene, чтобы посмотреть, смогу ли я повторно использовать существующий код.Я хотел бы иметь возможность получить разобранную версию запроса, чтобы перебирать предложения и искать определенные поля для манипуляции.Затем заново сгенерируйте строку запроса и передайте ее в SOLR.

Я подошел близко, используя QueryParser от Lucene, но я могу получить только термины, а не логические операторы:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
QueryParser queryParser = new QueryParser(Version.LUCENE_30, "text", analyzer);
try {
    Query query = queryParser.parse(queryString);
    Set<Term> terms = new TreeSet<Term>();
    query.extractTerms(terms);

    for (Term t : terms) {
        logger.info("Term - field:" + t.field() + " | text:" + t.text());
    }
} catch (ParseException ex) {
    logger.warn(ex.getMessage(), ex);
}

Я посмотрел на BooleanQuery , но мне тоже не повезло.Пожалуйста, помогите.

1 Ответ

4 голосов
/ 18 ноября 2011

Создайте свой собственный анализатор запросов:

class MyParser : MultiFieldQueryParser {
  @override
  public Query getFieldQuery(string field, string queryText) {
     if lookupSuccessful(field, queryText) { 
       return myQuery(field, queryText);
     }
     return base.getFieldQuery(field, queryText);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...