Неправильное соответствие запроса ElasticSearch - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь сопоставить запрос на основе полей URL. У меня есть метод вставки ниже, который срабатывает, когда кто-то добавляет новую ссылку на веб-страницу. Прямо сейчас, если какая-либо ссылка должна быть добавлена ​​с префиксом «https: //» или «http: //», она автоматически сопоставляет первый (и только в этом случае) элемент с https: // или «http: /». / »префикс в индексе. Это из-за того, что моя модель настроена на тип Uri? Вот пример моей модели и скриншот отладки для метода InsertLink.

Моя модель:

public class SSOLink
{
    public string Name { get; set; }
    public Uri Url { get; set; }
    public string Owner { get; set; }

}

Пример скриншота.

ElasticSearch Debug

1 Ответ

2 голосов
/ 23 марта 2020

Вам необходимо использовать токенайзер UAX_URL для поиска по полям URL.

Вы можете создать свой собственный анализатор с помощью токена UAX_URL и использовать тот же запрос match, который вы используете на данный момент, чтобы получить ожидаемый результат.

Отображение индекса

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "my_tokenizer"
                }
            },
            "tokenizer": {
                "my_tokenizer": {
                    "type": "uax_url_email",
                    "max_token_length": 5
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "url": {
                "type": "text",
                "analyzer": "my_analyzer"
            }
        }
    }
}

Похоже, в вашем случае поле URL использует текстовое поле в Elasticsearch, который использует стандартный анализатор и использует _analyze API, вы можете проверить токены, сгенерированные вашим полем URL.

Используя стандартный анализатор

POST _analyze/

{
    "text": "https://www.microsoft.com",
    "analyzer" : "standard"
}

Токены

{
    "tokens": [
        {
            "token": "https",
            "start_offset": 0,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "www.microsoft.com",
            "start_offset": 8,
            "end_offset": 25,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

Используя токенайзер UAX_URL

{
    "text": "https://www.microsoft.com",
    "tokenizer" : "uax_url_email"
}

И сгенерированные токены

{
    "tokens": [
        {
            "token": "https://www.microsoft.com",
            "start_offset": 0,
            "end_offset": 25,
            "type": "<URL>",
            "position": 0
        }
    ]
}
...