Как сделать Lucene QueryParser более щадящим?

вы можете перенаправить вывод времени с помощью

(time ls) &> file

Поскольку вам нужно взять (время ls) как одну команду, чтобы вы могли использовать фигурные скобки.

30
задан Winston Fassett 4 November 2008 в 19:30
поделиться

6 ответов

Ну, самая легкая вещь сделать состояла бы в том, чтобы дать необработанную форму запроса выстрел, и если это перестало работать, отступите к чистке его.

Query safe_query_parser(QueryParser qp, String raw_query)
  throws ParseException
{
  Query q;
  try {
    q = qp.parse(raw_query);
  } catch(ParseException e) {
    q = null;
  }
  if(q==null)
    {
      String cooked;
      // consider changing this "" to " "
      cooked = raw_query.replaceAll("[^\w\s]","");
      q = qp.parse(cooked);
    }
  return q;
}

Это дает необработанную форму запроса пользователя шанс работать, но при парсинге сбоев, мы разделяем все кроме букв, чисел, пробелов и подчеркиваний; тогда мы попробовали еще раз. Мы все еще рискуем бросать ParseException, но мы решительно уменьшили разногласия.

Вы могли также рассмотреть маркирование запроса пользователя сами, превратив каждый маркер в запрос термина и glomming их вместе с BooleanQuery. Если бы Вы действительно не ожидаете, что Ваши пользователи используют в своих интересах функции QueryParser, который был бы лучшим выбором. Вы были бы абсолютно (?) устойчивы, и пользователи могли искать любые забавные символы, сделает его через Ваш анализатор

8
ответ дан Jay Kominek 4 November 2008 в 19:30
поделиться

Я нахожусь в той же ситуации как Вы.

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

я также предоставляю ссылку на объяснение синтаксиса Lucene, который я упростил немного:
http://ifdefined.com/btnet/lucene_syntax.html

1
ответ дан Corey Trager 4 November 2008 в 19:30
поделиться

Если Вам не нужны все функции Lucene, Вы могли бы пойти лучше путем записи собственного анализатора запроса. Это не так сложно, как это могло бы казаться во-первых.

1
ответ дан Stefan Schultze 4 November 2008 в 19:30
поделиться
  • 1
    you' право ре. I' m пытающийся жениться на помощниках asp.net, jquery.validate-unobrusive и угловой. Кажется, что не легкий, поскольку это смотрит – iLemming 10 April 2013 в 21:07

Эй может заставить Lucene проигнорировать специальные символы путем очистки запроса с чем-то как

query = QueryParser.Escape(query)

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

, Если Вы хотите, чтобы Ваши пользователи использовали усовершенствованный синтаксис, но Вы также хотите быть более прощающими с ошибками, которые необходимо только санировать после того, как ParseException произошел.

43
ответ дан ljorquera 4 November 2008 в 19:30
поделиться
  • 1
    Здесь это идет . Снова, попытка взять под контроль момент изменения . Если Вы can' t, затем посмотрите мой код. Помните, что необходимо вызвать _rootScope.$apply() (сохраненный в MainController), чтобы к Угловому делают заметки от изменения. Логика переключателя находится в index.html, последнее script тег. И эти app.js содержит Угловой код. – Caio Cunha 10 April 2013 в 22:49

Я не знаю много о Lucene.net. Для генерала Lucene я настоятельно рекомендую книге Lucene в Действии . Для вопроса под рукой, это зависит от Ваших пользователей. Существуют веские причины, такие как простота использования, безопасность и производительность, для ограничения запросов пользователей. Книга показывает способы проанализировать запросы с помощью пользовательского синтаксического анализатора вместо QueryParser. Я идея второго Jay о BooleanQuery, хотя можно создать более сильные запросы с помощью пользовательского синтаксического анализатора.

1
ответ дан Yuval F 4 November 2008 в 19:30
поделиться
  • 1
    Так как Вы делаете его за пределами Углового " boundry" Угловой не собирается знать, также добавляя, что код UI в Контроллерах не является способом пойти. При попытке создать решение для Проверки, обратитесь к руководству по проверке по AngularJS. – Ketan 9 April 2013 в 23:44

К вашему сведению ... Вот код, который я использую для .NET

private Query GetSafeQuery(QueryParser qp, String query)
{
    Query q;
    try 
    {
        q = qp.Parse(query);
    } 

    catch(Lucene.Net.QueryParsers.ParseException e) 
    {
        q = null;
    }

    if(q==null)
    {
        string cooked;

        cooked = Regex.Replace(query, @"[^\w\.@-]", " ");
        q = qp.Parse(cooked);
    }

    return q;
}
3
ответ дан 27 November 2019 в 23:49
поделиться