использовать Elastic search dsl python для анализа API

Как использовать _analyze по умолчанию в эластичном поиске dsl python?

Мой запрос выглядит следующим образом:

query = Q('regexp', field_name = "f04((?!z).)*")
search_obj = Search(using = conn, index = index_name, doc_type = type_name).query(query)
response = search_obj[0:count].execute()

Куда мне поставить analyze() method, чтобы я мог видеть, как мой "f04((?!z).)*" разбивается на термины? На самом деле кажется, что '!' не работает как регулярное выражение. Как изменить анализатор, если анализатор по умолчанию не может принять '!' в качестве символа регулярного выражения?

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


person zubug55    schedule 10.08.2018    source источник


Ответы (1)


Я не уверен, чего именно вы хотите достичь. Если вы разместили запрос CURL, который делает то, что вы хотите, было бы проще перевести его в интерфейс Elasticsearch DSl или elasticsearch-py.

Если вы ищете альтернативу методу _analyze, но в Python, вы можете добиться этого с помощью elasticsearch-py, хотя я не уверен, что вы можете сделать это с помощью Elasticsearch DSL. Допустим, я хочу увидеть результаты анализа моей строки jestem biały miś с помощью моего анализатора с именем morfologik. Используя CURL, я бы просто запустил:

$ curl -XGET "http://localhost:9200/morf_texts/_analyze" -H 'Content-Type: application/json' -d'
{
  "analyzer": "morfologik",
  "text": "jestem biały miś"
}'

{
  "tokens": [
    {
      "token": "być",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "biały",
      "start_offset": 7,
      "end_offset": 12,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "miś",
      "start_offset": 13,
      "end_offset": 16,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "misić",
      "start_offset": 13,
      "end_offset": 16,
      "type": "<ALPHANUM>",
      "position": 2
    }
  ]
}

Чтобы добиться того же результата с помощью elasticsearch-py, вы можете запустить следующее:

from elasticsearch import Elasticsearch
from elasticsearch.client import IndicesClient

client = Elasticsearch()
indices_client = IndicesClient(client)

indices_client.analyze(
    body={
        "analyzer": "morfologik",
        "text": "jestem biały miś",
    }
)

Вывод метода analyze такой же, как и в приведенном выше запросе CURL:

{'tokens': [{'token': 'być',
   'start_offset': 0,
   'end_offset': 6,
   'type': '<ALPHANUM>',
   'position': 0},
  {'token': 'biały',
   'start_offset': 7,
   'end_offset': 12,
   'type': '<ALPHANUM>',
   'position': 1},
  {'token': 'miś',
   'start_offset': 13,
   'end_offset': 16,
   'type': '<ALPHANUM>',
   'position': 2},
  {'token': 'misić',
   'start_offset': 13,
   'end_offset': 16,
   'type': '<ALPHANUM>',
   'position': 2}]}
person mrapacz    schedule 13.03.2019