Как я могу использовать sql как и предложения в ElasticSearch?

я прочитал этот документ, чтобы понять равенство sql в elasticsearch.(https://taohiko.wordpress.com/2014/07/18/query-dsl-elasticsearch-vs-sql/) я разработал своего рода приложение elasticsearch, которое делает индексы из моих данных, если я позвоню ниже отправить запрос с помощью почтальона:


{
  "query": {
    "multi_match" : {
      "query":      "TÜRKİYE iş 3124904300",
      "type":       "cross_fields",
      "fields":     [ "title", "tcknVkn","phone","townName","cityName","poiDesc","district","street","avenue","buildingName","addressName" ],
      "operator":   "and" 
    }
  }
}

он работает идеально. Но я хочу сделать это;


{
  "query": {
    "multi_match" : {
      "query":      "TÜRKİYE iş 312*",
      "type":       "cross_fields",
      "fields":     [ "title", "tcknVkn","phone","townName","cityName","poiDesc","district","street","avenue","buildingName","addressName" ],
      "operator":   "and" 
    }
  }
}

означает:


select * from mytable where title like 'TÜRKİYE%' and addressName like 'iş%' and 
tcknVkn like '312%'

но. если я напишу запрос выше, elasticsearch не сможет понять числовое значение. Так он возвращает мне пустые данные? Как я могу решить эту проблему. Как я могу преобразовать приведенный выше запрос sql в запрос elasticsearch?

(БУДЬТЕ ОСТОРОЖНЫ: "title", "tcknVkn","phone","townName","cityName","poiDesc","район","улица","проспект","название здания", "addressName" -> все поля индексируются как строки)


comment
Вы пробовали как "query": "TÜRKİYE* iş* 312*",   -  person hkulekci    schedule 27.02.2017
comment
Я думаю, вы должны создать строковое значение значения tcknVkn при создании сопоставления.   -  person hkulekci    schedule 27.02.2017
comment
@hkulecki tcknVkn — это строка. На самом деле все индексируется как строка   -  person loki    schedule 27.02.2017
comment
Вы можете использовать регулярное выражение. Посмотрите это пожалуйста.   -  person Ali Moshiri    schedule 16.08.2018
comment
Вы также можете использовать регулярное выражение. stackoverflow.com/questions/6467067/ У меня это сработало.   -  person Ali Moshiri    schedule 16.08.2018


Ответы (1)


multi_match запрос по существу создает запрос на несколько совпадений. И ваш запрос создается следующим образом:

{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":   "TÜRKİYE iş 312*" }},
        { "match": { "tcknVkn": "TÜRKİYE iş 312*" }},
        { "match": { "phone":   "TÜRKİYE iş 312*" }},
        ...
      ]
    }
  }
}

Это не совсем похоже на приведенный выше пример, но похоже. Но вы хотите разделить ключевые слова запроса. Я создаю следующий пример для примера вашей ситуации:

POST test2/test/_mapping
{
  "properties": {
    "tcNo": {
      "type": "long",
      "fields": {
        "text": {
          "type": "text"
        },
        "numeric": {
          "type": "integer"
        }
      }
    }
  }
}

POST test2/test
{
  "id": 0,
  "tcNo": 23432344,
  "name": "hay0"
}

POST test2/test
{
  "id": 1,
  "tcNo": 23442344,
  "name": "haydar1"
}

POST test2/test
{
  "id": 2,
  "tcNo": 23432344,
  "name": "haydar2"
}

POST test2/test
{
  "id": 3,
  "tcNo": 23542344,
  "name": "haydar3"
}


GET test2/_search
{
  "query": {
    "multi_match" : {
      "query":      "haydar* 234*",
      "type":       "phrase_prefix",
      "fields":     ["tcNo.text", "name"],
      "operator":   "AND" 
    }
  }
}

POST test2/test/_search
{
  "query": {
    "query_string": {
      "fields": ["tcNo.text", "name"],
      "query": "haydar* AND 234*"
    }
  }
}

# similar with last one
POST test2/test/_search
{
  "query": {
    "query_string": {
      "query": "(tcNo.text:234* OR name.text:234*) AND (tcNo.text:haydar* OR name:haydar*)"
    }
  }
}

Да, я знаю все ваши строки строк. Но я предпочитаю использовать длинный или целочисленный тип для целочисленных данных. В конце запросов multi_match один не возвращает никакого результата, но query_string возвращает два правильных результата. Итак, вы можете использовать query_string запрос для поиска.

person hkulekci    schedule 27.02.2017
comment
Привет; это отличный ответ. Вы спасли мою жизнь. Спасибо, чувак (эйваллах) - person loki; 27.02.2017
comment
Но я кое-что понял. все запросы, работающие с И, выдают данные типа ИЛИ (и var ama или gibi davranıyor). - person loki; 27.02.2017
comment
Я добавил дополнительный запрос. Второй запрос похож на (tcNo.text:234* OR name.text:234*) AND (tcNo.text:haydar* OR name:haydar*) этот. Вы можете изменить второй запрос как третий. - person hkulekci; 27.02.2017