2016-04-27 2 views
3

Я работаю на поисковом сервере, как-то вроде поиска эластичных. Просто небольшой проект, который я разрабатываю. Завершили большинство частей, но я застрял на том, как пользователь будет взаимодействовать с системой.Создайте язык запроса с помощью Python

Первоначально Я решил, что пользователь запросит отправку запроса JSON с обязательными полями и его значениями. Но проблема, с которой я сталкиваюсь, заключается в том, что, хотя я могу оценивать запросы с использованием json-метода, я не смог бы реализовать запросы Boolean Queries и Compounf.

Я пытался что-то вроде

index: name 
schema:name 
field1: value 
field 2: value 

, но это также может быть что-то вроде этого, если логическое выражение реализуется

index : name 
schema : name 
field 1 : name1 or name 2 
field 2: <9.22 and >=2.32 
field 3: (<9.22 and >=2.32) or (<100 and >90) // compound statement. 

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

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

Я также проверял пипарирование, но я не мог понять, как это использовать.

+0

Проверьте [whoosh] (https://bitbucket.org/mchaput/whoosh/wiki/Home) или [plyse] (https://github.com/sebastiandev/plyse). Кроме того, pyparsing включает несколько образцов парсеров запросов на странице [Примеры] (http://pyparsing.wikispaces.com/Examples). – PaulMcG

ответ

1

Настоящий вопрос заключается в том, насколько сложны ваши составные заявления, которые будут получать, и они только идут для включения ключевых слов AND и OR. Из того, что я могу сказать, заключается в том, что вам лучше определить правильную грамматику для этого, чем просто использовать смесь регулярных выражений, чтобы выполнить работу (хотя это и есть грамматика в основном).

Я бы предложил использовать parsely, где вы можете четко определить грамматику в лексическом формате и создать синтаксический анализатор для вас. Таким образом, вы можете лучше обозначать вещи и лучше понимать, когда вы отлаживаете.

+0

Ну, я хочу рассмотреть даже большие запросы со многими условиями для поля. конечно, будут ограничения, такие как не использование смешанных типов данных для определенного поля (например, <9 и == "что-то", но эта проверка типов данных придет после фактического разбора.). Большинство запросов будут использовать и, или, не, не равно, а не. Будет проверять петрушку и вернуться к вам –

+0

Петрушка выполнила большую часть заданий. Спасибо –

+0

Heyy, если бы вы могли, не могли бы вы взглянуть на это http://stackoverflow.com/questions/37187918/regex-parse-error-by-parsley-python –

1

Несомненно. Вот пример, который просто использует JSON.

Для основного запроса одного поля, используйте отображение:

{"fieldname": {"op": "=", "value": "somevalue"}} 

Для составного запроса, сделать что-то вроде:

{"and": [ 
    {"field": {"op": "=", "value": "somevalue"}}, 
    {"field2": {"op": ">", "value": 9.22}}, 
    ]} 

Для сложного запроса, как в вашем примере:

{ 
    "and": [ 
    { 
     "index": { 
     "op": "=", 
     "value": "name" 
     } 
    }, 
    { 
     "schema": { 
     "op": "=", 
     "value": "name" 
     } 
    }, 
    { 
     "or": [ 
     { 
      "field1": { 
      "op": "=", 
      "value": "name1" 
      } 
     }, 
     { 
      "field1": { 
      "op": "=", 
      "value": "name2" 
      } 
     } 
     ] 
    }, 
    { 
     "or": [ 
     { 
      "field2": { 
      "op": "<", 
      "value": 9.22 
      } 
     }, 
     { 
      "field2": { 
      "op": ">=", 
      "value": 2.32 
      } 
     } 
     ] 
    }, 
    { 
     "or": [ 
     { 
      "or": [ 
      { 
       "field3": { 
       "op": "<", 
       "value": 9.22 
       } 
      }, 
      { 
       "field3": { 
       "op": ">=", 
       "value": 2.32 
       } 
      } 
      ] 
     }, 
     { 
      "or": [ 
      { 
       "field3": { 
       "op": "<", 
       "value": 100 
       } 
      }, 
      { 
       "field3": { 
       "op": ">", 
       "value": 90 
       } 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 
+1

Хотя это имеет смысл, когда он будет писать письма, это будет кошмар. Лучше просто иметь парсер языка запросов на бэкэнд, чтобы упростить интерфейс. –

+0

Я на самом деле не думаю, что это будет кошмар для обработки, если вы не будете регулярно делать большие сложные запросы вручную и не сильно отличается по духу со многими существующими решениями (структура почти идентична тому, как строки фильтра LDAP структурированные, например). – larsks

+0

Этот подход является самым простым способом, который я мог бы сделать на стороне разработчика. Но, как сказал Брайняк, людям было бы очень сложно делать такие сложные запросы. (<9.22 and > = 2.32) или (<100 and > 90). Это еще не очень сложное утверждение, оно заняло так много персонажей.Я думаю, было бы лучше, если бы конечный пользователь использовал какой-то язык запросов для этого –