Как проиндексировать поле с буквенно-цифровыми символами И тире для поиска по шаблону - PullRequest
0 голосов
/ 26 марта 2019

Учитывая модель, которая выглядит следующим образом:

{
    [Key]
    public string Id { get; set; }

    [IsSearchable]
    [Analyzer(AnalyzerName.AsString.Keyword)]
    public string AccountId { get; set; }
}

И пример данных для AccountId, который будет выглядеть следующим образом:

1-ABC123
1-333444555
1-A4KK498

Поле может содержать любую комбинацию букв / цифр и тире в середине.

Мне нужно иметь возможность искать в этом поле, используя такие запросы, как 1-ABC *. Однако, похоже, что ни один из базовых анализаторов не поддерживает дефис, кроме ключевого слова, которое не отвечает на запросы с подстановочными знаками, а только полностью совпадает. Я видел несколько других статей о пользовательских анализаторах, но не могу получить достаточно информации о том, как его построить, чтобы решить эту проблему.

Мне нужно знать, нужно ли мне создавать анализатор клиентов для этой области, и нужен ли мне другой анализатор поиска и анализатор индекса?

Я использую StandardLucene для других буквенно-цифровых полей без штрихов, и у меня есть еще одно поле с штрихами, но это все цифры, и Keyword там прекрасно работает. Кажется, проблема в сочетании букв и цифр.

1 Ответ

1 голос
/ 26 марта 2019

Пользовательский анализатор - действительно путь сюда. По сути, вы можете определить собственный анализатор, который использует токенайзер «ключевое слово» с фильтром токенов «строчные буквы».

Добавьте пользовательский анализатор в свой класс Index и измените имя анализатора в вашей модели в соответствии с именем пользовательского анализатора:

new Index()
{
    ...
    Analyzers = new[]
    {
        new CustomAnalyzer()
        {
            Name = "keyword_lowercase",
            Tokenizer = TokenizerName.Keyword,
            TokenFilters = new[] { TokenFilterName.Lowercase }
        }
    }
}

Модель:

{
    [Key]
    public string Id { get; set; }

    [IsSearchable]
    [Analyzer("keyword_lowercase")]
    public string AccountId { get; set; }
}

В REST API это будет выглядеть примерно так:

{
    "fields": [{
        "name": "Id",
        "type": "Edm.String",
        "key": true
    },
    {
        "name": "AccountId",
        "type": "Edm.String",
        "searchable": true,
        "retrievable": true,
        "analyzer": "keyword_lowercase"
     }],
    "analyzers":[
        {
           "name":"keyword_lowercase",
           "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
           "tokenizer":"keyword_v2",
           "tokenFilters":["lowercase"]
        }
     ]
}
...