Azure搜索-语音搜索实施

时间:2019-02-07 09:59:15

标签: azure elasticsearch lucene azure-search

我在运气不好的情况下尝试使用Azure搜索进行腓尼基搜索。我的目标是制定一个索引配置,该配置可以处理拼写错误并为最终用户提供语音搜索功能。

使用以下配置和示例数据,我试图搜索故意拼写错误的单词,例如“ softvare”或“ alek”。感谢音标分析仪,我得到了“ alek”的结果;但没有得到“ 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
        }
    ]
}

分析“ softvare”的API输入和输出

{
     "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 :(得分:0)

我从事Azure搜索。在我提出处理拼写错误的单词的方法之前,先了解一下您的自定义分析器(my_standard)配置将很有帮助。它可能告诉我们为什么它无法处理“软假”案件。作为DIY,您可以使用Analyze API来查看使用自定义分析器创建的令牌,并且令牌中应包含与文档实际匹配的“软件”。

现在,这里有几种方法可以单独使用或结合使用以处理拼写错误的单词。最佳方法因用例而异,我强烈建议您尝试使用这些方法来找出您所用的最佳方法。

  1. 您已经熟悉语音过滤器,这是处理相似发音术语的常用方法。如果还没有,请为过滤器尝试使用不同的编码器,以评估哪种配置可以为您带来最佳效果。请查看编码器列表here

  2. 在Azure搜索中使用支持作为Lucene查询语法一部分的模糊查询,该模糊查询根据距离度量返回与原始查询词相近的词。这里的局限性是它只能在一个术语上运行。查看docs了解更多详细信息。示例查询看起来像-search=softvare~1在原始术语也是有效术语的情况下,您也可以使用术语增强来增强原始术语。

  3. 您还提到了同义词,该同义词也用于查询拼写错误的术语。这种方法使您可以最大程度地控制输入错误的过程,但还要求您对术语的不同输入有先验知识。如果您想尝试同义词,可以使用这些docs

答案 1 :(得分:0)

您可以在我的文章中阅读;我的目标是处理错字。

唯一简单的选择是使用内置的Lucene功能-模糊搜索。我尚未检查响应时间,因为使用模糊搜索必须将querytype设置为“ full”。否则,结果令人满意。

示例: search=softvare~&fuzzy=true&querytype=full 将返回其中包含“软件”的所有文档。

如需进一步阅读,请浏览Documentation

相关问题