Преобразовать инфиксное выражение в эластичный поисковый запрос - PullRequest
0 голосов
/ 31 декабря 2018

Как я могу преобразовать инфиксное выражение в эластичный поисковый запрос
мои операторы ! + *
, и пользователь может создать любое выражение, используя эти операторы, например:
(((A*B*(!C))*(D*E))+F)*G
иЯ хочу преобразовать его в запрос bool в упругом поиске

Редактировать
Я не знаю, почему я не сказал этого раньше, но у меня естьЯ уже написал код для преобразования инфикса в постфиксное выражение, а затем я вызываю очень грязный рекурсивный метод для создания should (+), must (*) and must_not (!), но то, что я ищу, - это оптимизированный способ сделать свое дело для меня.

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

{
  "from": 0,
  "size": 10,
  "_source": [
    "*"
  ],
  "index": "insta_userpost_new2",
  "body": {
    "query": {
      "bool": {
        "must": [
          {
            "match_phrase": {
              "caption.text": "G"
            }
          },
          {
            "bool": {
              "should": [
                {
                  "match_phrase": {
                    "caption.text": "F"
                  }
                },
                {
                  "bool": {
                    "must": [
                      {
                        "bool": {
                          "must": [
                            {
                              "match_phrase": {
                                "caption.text": "E"
                              }
                            },
                            {
                              "match_phrase": {
                                "caption.text": "D"
                              }
                            }
                          ]
                        }
                      },
                      {
                        "bool": {
                          "must": [
                            {
                              "bool": {
                                "must_not": [
                                  {
                                    "match_phrase": {
                                      "caption.text": "C"
                                    }
                                  },
                                  {
                                    "bool": {
                                      "must": [
                                        {
                                          "match_phrase": {
                                            "caption.text": "B"
                                          }
                                        },
                                        {
                                          "match_phrase": {
                                            "caption.text": "A"
                                          }
                                        }
                                      ]
                                    }
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            }
          }
        ]
      }
    }
  }
}

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Вы можете запустить оценку выражений инфикса [1] и заменить стандартные операции eval на составители DSL bool запросов.

На самом деле мы делаем что-то похожее на https://opensource.appbase.io/mirage/ (вы можете попробовать этоlive), где мы отображаем блоки GUI в составляемый запрос bool.Исходный код доступен для просмотра в https://github.com/appbaseio/mirage.

[1] Ссылка: https://www.geeksforgeeks.org/expression-evaluation/

0 голосов
/ 05 января 2019

Возможно, я бы попытался использовать simply_query_string.Для этого вам необходимо:

  • заменить + на | (для OR)
  • , а затем заменить * на + (дляAND)
  • наконец заменит ! на - (для NOT)

Так что, если пользователь вводит это:

(((A*B*(!C))*(D*E))+F)*G

В итоге вы получите это

(((A+B+(-C))+(D+E))|F)+G

. Это логическое выражение, которое вы можете напрямую использовать в запросе simply_query_string.

GET /_search
{
    "query": {
        "simple_query_string" : {
            "fields" : ["content"],
            "query" : "(((A+B+(-C))+(D+E))|F)+G"
        }
    }
}
0 голосов
/ 31 декабря 2018

Вы можете использовать сценарии Elasticsearch в запросах, например: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-script-query.html

Существует несколько вариантов сценариев, при этом самый простой и прямой путь - это «Безболезненные» сценарии.Из эластичной документации:

Когда вы определяете поле сценариев в Kibana, у вас есть выбор языков сценариев.Начиная с версии 5.0, по умолчанию используются выражения Lucene и Painless

. Вы также можете вернуть результат вычисления, используя Scripted Fields: https://www.elastic.co/guide/en/kibana/current/scripted-fields.html

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