Невозможно найти запрос с символами вasticsearch - PullRequest
6 голосов
/ 04 июля 2019

Я пытался сопоставить запрос, используя asticsearch Python-клиент , но я не могу сопоставить его даже после использования escape-символов, установки некоторых пользовательских анализаторов и их сопоставления.Я хочу выполнить поиск, используя &, и он не дает никакого ответа.

from elasticsearch import Elasticsearch

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])


doc1 = {
    'name': 'numb',
    'band': 'linkin_park',
    'year': '2006'
}

doc2 = {
    'name': 'Powerless &',
    'band': 'linkin_park',
    'year': '2006'
}
doc3 = {
    'name': 'Crawling !',
    'band': 'linkin_park',
    'year': '2006'
    }

doc =[doc1, doc2, doc3]
'''
create_index = {
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "type": "custom",
                    "filter": [
                        "lowercase"
                    ],
                    "tokenizer": "whitespace"
                }
            }
        }
    }
}

es.indices.create(index="idx_temp", body=create_index)
'''
for i in range(3):
    es.index(index="idx_temp", doc_type='_doc', id=i, body=doc[i])


my_mapping = {
  "properties": {
      "name": {
          "type": "text",
          "fields": {
              "keyword": {
                  "type": "keyword",
                  'ignore_above': 256
              }
          },
          "analyzer": "my_analyzer"
          "search_analyzer": "my_analyzer"
      },
      "band": {
          "type": "text",
          "fields": {
              "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
              }
          },
          "analyzer": "my_analyzer"
          "search_analyzer": "my_analyzer"
      },
      "year": {
          "type": "text",
          "fields": {
              "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
              }
          },
          "analyzer": "my_analyzer"
          "search_analyzer": "my_analyzer"
      }
  }
}

es.indices.put_mapping(index='idx_temp', body=my_mapping, doc_type='_doc', include_type_name=True)

res = es.search(index='idx_temp', body={
    "query": {
        "match": {
            "name": {
                "query": "powerless &",
                "fuzziness": 3

            }
        }
    }
})

for hit in res['hits']['hits']:
    print(hit['_source'])

Ожидаемый результат был 'name': 'Poweeerless &',, но я получил 0 обращений и не вернул значение.

Ответы [ 2 ]

2 голосов
/ 12 июля 2019

Итак, я исправил проблему, добавив еще одно поле

 "search_quote_analyzer": "my_analyzer"

в поле настроек после

"analyzer": "my_analyzer"
"search_analyzer": "my_analyzer"

А потом я получаю свой вывод, выполняя поиск по & в запросе как

'name': 'Poweeerless &'
2 голосов
/ 04 июля 2019

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

  1. Избегайте специального символа &, когда я пытался проиндексировать документ, используя ES REST API напрямую, используя под телом в почтальоне:

{"content": "Powerless \ &"}

Тогда ES дал мне исключение Unrecognized character escape '&', и даже Postman, популярный клиент REST, также былвыдает предупреждение о неправильной строке.

Затем я изменил полезную нагрузку на нижнюю и смог проиндексировать документ:

{
    "content": "Powerless \\&" :-> Notice I added a another `\` to escape the `&`
}
Я изменил запрос на использование того же поля, , которое имело значение &, в вашем случае это поле name, а не поле content. , так как запрос на совпадение проанализировал и использует тот же анализатор, который используется для индексации времени.И смог получить результат.

PS: Я также проверил ваш анализатор, используя _analyze api, и он генерирует следующие токены для текста Powerless \\&

{
    "tokens": [
        {
            "token": "powerless",
            "start_offset": 0,
            "end_offset": 9,
            "type": "word",
            "position": 0
        },
        {
            "token": "\\&",
            "start_offset": 10,
            "end_offset": 12,
            "type": "word",
            "position": 1
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...