Поиск Azure - реализация фонетического поиска - PullRequest
0 голосов
/ 07 февраля 2019

Я безуспешно пробовал поиск в Phoenetic с помощью Azure Search.Моя цель состоит в том, чтобы разработать конфигурацию индекса, которая может обрабатывать опечатки и обеспечивать фонетический поиск для конечных пользователей.

С помощью приведенной ниже конфигурации и примеров данных я пытался найти преднамеренно неправильно написанные слова, такие как «softvare» или «Алик.Я получил результаты для «Алек», спасибо за фонетический анализатор;но не получил никаких результатов для 'softvare'.

Похоже, что это требование фонетического поиска не сработает.

Единственный вариант, который я нашел, - использовать карту синонимов.Основная ошибка заключается в том, что я не могу использовать анализатор фонетики / пользовательский анализ вместе с синонимами: (

Какие стратегии вы бы порекомендовали для обработки опечаток?

поисковый запросиспользуется

  1. ?api-version=2017-11-11&search=alec
  2. ?api-version=2017-11-11&search=softvare

Вот индекс конфигурации

 "name": "phonetichotels",  
 "fields": [
   {"name": "hotelId", "type": "Edm.String", "key":true, "searchable": false},
   {"name": "baseRate", "type": "Edm.Double"},
   {"name": "description", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "analyzer":"my_standard"},
   {"name": "hotelName", "type": "Edm.String", "analyzer":"my_standard"},
   {"name": "category", "type": "Edm.String", "analyzer":"my_standard"},
   {"name": "tags", "type": "Collection(Edm.String)", "analyzer":"my_standard"},
   {"name": "parkingIncluded", "type": "Edm.Boolean"},
   {"name": "smokingAllowed", "type": "Edm.Boolean"},
   {"name": "lastRenovationDate", "type": "Edm.DateTimeOffset"},
   {"name": "rating", "type": "Edm.Int32"},
   {"name": "location", "type": "Edm.GeographyPoint"}
  ],

Анализатор (частьсоздание индекса)

"analyzers":[
    {
      "name":"my_standard",
      "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
      "tokenizer":"standard_v2",
      "tokenFilters":[ "lowercase", "asciifolding", "phonetic" ]
    }
  ]

Анализ ввода и вывода API для «программного обеспечения»

{
     "analyzer":"my_standard",
     "text": "software"
  }

{
    "@odata.context": "https://ctsazuresearchpoc.search.windows.net/$metadata#Microsoft.Azure.Search.V2017_11_11.AnalyzeResult",
    "tokens": [
        {
            "token": "SFTW",
            "startOffset": 0,
            "endOffset": 8,
            "position": 0
        }
    ]
}

Анализ ввода и вывода API для «softvare»

{
     "analyzer":"my_standard",
     "text": "softvare"
  }

{
    "@odata.context": "https://ctsazuresearchpoc.search.windows.net/$metadata#Microsoft.Azure.Search.V2017_11_11.AnalyzeResult",
    "tokens": [
        {
            "token": "SFTF",
            "startOffset": 0,
            "endOffset": 8,
            "position": 0
        }
    ]
}

Пример данныхчто я загрузил

{
         "@search.action": "upload",
         "hotelId": "5",
         "baseRate": 199.0,
         "description": "Best hotel in town for software people",
         "hotelName": "Fancy Stay",
         "category": "Luxury",
         "tags": ["pool", "view", "wifi", "concierge"],
         "parkingIncluded": false,
         "smokingAllowed": false,
         "lastRenovationDate": "2010-06-27T00:00:00Z",
         "rating": 5,
         "location": { "type": "Point", "coordinates": [-122.131577, 47.678581] }
       },
{
         "@search.action": "upload",
         "hotelId": "6",
         "baseRate": 79.99,
         "description": "Cheapest hotel in town ",
         "hotelName": " Alec Baldwin Motel",
         "category": "Budget",
         "tags": ["motel", "budget"],
         "parkingIncluded": true,
         "smokingAllowed": true,
         "lastRenovationDate": "1982-04-28T00:00:00Z",
         "rating": 1,
         "location": { "type": "Point", "coordinates": [-122.131577, 49.678581] }
       },

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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Как вы могли прочитать в моем посте;Моя цель состояла в том, чтобы справиться с опечатками.

Единственный простой вариант - использовать встроенную функциональность Lucene - Fuzzy Search.Мне еще предстоит проверить время ответа, так как тип запроса должен быть установлен на «полный» для использования нечеткого поиска.В противном случае результаты были удовлетворительными.

Пример: search=softvare~&fuzzy=true&querytype=full вернет все документы с «Программным обеспечением» в нем.

Для дальнейшего чтения перейдите по Документация

0 голосов
/ 08 февраля 2019

Я работаю в Azure Search.Прежде чем предлагать подходы к обработке слов с ошибками, было бы полезно взглянуть на конфигурацию вашего пользовательского анализатора (my_standard).Это может сказать нам, почему он не может справиться со случаем «softvare».Как самодельный пользователь, вы можете использовать Analyze API для просмотра токенов, созданных с помощью вашего пользовательского анализатора, и он должен содержать «программное обеспечение» для фактического соответствия документам.

Теперь вотнесколько способов, которые можно использовать независимо или совместно для обработки слов с ошибками.Лучший подход варьируется в зависимости от варианта использования, и я настоятельно рекомендую вам поэкспериментировать с ним, чтобы определить лучший в вашем случае.

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

  2. Использовать нечеткие запросы, поддерживаемые как часть синтаксиса запроса Lucene в Поиске Azure, который возвращает условия, близкие к исходному запросу.на основе метрики расстояния.Ограничение здесь состоит в том, что он работает на один терминПроверьте документы для более подробной информации.Пример запроса будет выглядеть так: search=softvare~1 Вы также можете использовать повышение терминов, чтобы увеличить первоначальный термин в тех случаях, когда исходный термин также является допустимым.

  3. Вы также ссылались насинонимы, которые также используются для запроса с ошибочными терминами.Этот подход дает вам максимальный контроль над процессом обработки опечаток, но также требует предварительного знания различных опечаток для терминов.Вы можете использовать эти документы , если хотите поэкспериментировать с синонимами.

...