Анализатор образов не работает с UUID вasticsearch - PullRequest
1 голос
/ 04 мая 2020

Я используюasticsearch версии 7.x и создал индекс учетной записи со следующим сопоставлением.

    curl --location --request PUT 'http://localhost:9200/accounts' \
--header 'Content-Type: application/json' \
--data-raw '{
    "mappings": {
            "properties": {
                "type": {"type": "keyword"},
                "id": {"type": "keyword"},
                "label": {"type": "keyword"},
                "lifestate": {"type": "keyword"},
                "name": {"type": "keyword"},
                "users": {"type": "text"}
            }
    }
}'

, и я храню пользователей в виде массива. В моем случае использования учетная запись может иметь n-количество пользователей. Поэтому я храню его в следующем формате.

curl --location --request PUT 'http://localhost:9200/accounts/_doc/account3' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id" : "account_uuid",
    "name" : "Account_Description",
    "users" : [
        "id:6de57db5-8fdb-4a39-ab46-21af623692ea~~status:ACTIVE",
        "id:9611e2be-784f-4a07-b5de-564b3820a660~~status:INACTIVE"
    ]
}'

И для поиска по идентификаторам пользователей и их статусу я создал анализатор шаблонов, который разбивается на символ ~~, как показано ниже.

curl --location --request PUT 'http://localhost:9200/accounts/_settings' \
--header 'Content-Type: application/json' \
--data-raw '{
  "settings": {
    "analysis": {
      "analyzer": {
        "p_analyzer": { 
          "type": "pattern",
          "pattern" :"~~"
        }
      }
    }
  }
}'

И поисковый запрос Вызов

curl --location --request GET 'http://localhost:9200/accounts/_search' \
--header 'Content-Type: application/json' \
--data-raw '{
    "query": {
        "bool": {
            "filter": [ 
                { "term": {"id": "account_uuid"} },
                { "match" : {"users" : {
                    "query" : "id:<user_id>",
                    "analyzer" : "p_analyzer"
                }}}
            ]   
        }
    }
}'

Это работает, если формат идентификатора пользователя - простая строка. То есть, если идентификатор пользователя хранится в формате, отличном от UUID, он работает хорошо. Но он не работает с идентификатором в формате UUID. Как заставить это работать?

1 Ответ

1 голос
/ 04 мая 2020

Измените ваш анализатор так, чтобы он включал гипс -, который должен решить вашу проблему, поскольку он создает токен для UUID.

{
  "settings": {
    "analysis": {
      "analyzer": {
        "p_analyzer": {
          "type":      "pattern",
          "pattern":   "~~|-",  --> note hypen is included `-`
          "lowercase": true
        }
      }
    }
  }
}

При использовании вышеуказанного анализатора генерируются следующие токены

POST / your-index / _analyze

{
  "text" : "6de57db5-8fdb-4a39-ab46-21af623692ea~~status:ACTIVE",
  "analyzer" : "my_email_analyzer"
}

Сгенерированные токены

{
    "tokens": [
        {
            "token": "6de57db5",
            "start_offset": 0,
            "end_offset": 8,
            "type": "word",
            "position": 0
        },
        {
            "token": "8fdb",
            "start_offset": 9,
            "end_offset": 13,
            "type": "word",
            "position": 1
        },
        {
            "token": "4a39",
            "start_offset": 14,
            "end_offset": 18,
            "type": "word",
            "position": 2
        },
        {
            "token": "ab46",
            "start_offset": 19,
            "end_offset": 23,
            "type": "word",
            "position": 3
        },
        {
            "token": "21af623692ea",
            "start_offset": 24,
            "end_offset": 36,
            "type": "word",
            "position": 4
        },
        {
            "token": "status:active",
            "start_offset": 38,
            "end_offset": 51,
            "type": "word",
            "position": 5
        }
    ]
}

Теперь поиск 6de57db5-8fdb-4a39-ab46-21af623692ea разбил бы его на 6de57db5 , 8fdb, 4a39 и т. Д. И будет соответствовать токену, сгенерированному во время индекса, и попадет в результат поиска.

...