【问题标题】:Azure Search - phonetic search implementationAzure 搜索 - 拼音搜索实现
【发布时间】:2019-07-01 09:54:05
【问题描述】:

我在尝试使用 Azure 搜索的 Phoenetic 搜索时运气不佳。我的目标是制定一个索引配置,可以处理拼写错误并适应最终用户的语音搜索。

使用以下配置和示例数据,我试图搜索故意拼写错误的单词,例如“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] }
       },

使用正确的配置,即使是拼写错误的单词,我也应该得到结果。

【问题讨论】:

    标签: azure elasticsearch lucene azure-cognitive-search


    【解决方案1】:

    我从事 Azure 搜索。在我建议处理拼错单词的方法之前,查看您的自定义分析器 (my_standard) 配置会很有帮助。它可能会告诉我们为什么它无法处理“softvare”的情况。作为 DIY 用户,您可以使用 Analyze API 查看使用您的自定义分析器创建的令牌,它应该包含“软件”以实际匹配文档。

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

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

    2. 使用支持的模糊查询作为 Azure 搜索中 Lucene 查询语法的一部分,该语法根据距离度量返回接近原始查询词的词。这里的限制是它只适用于一个术语。查看docs 了解更多详情。示例查询看起来像 - search=softvare~1 在原始术语也是有效术语的情况下,您还可以使用术语提升来为原始术语提供更多提升。

    3. 您还提到了同义词,它也用于查询拼写错误的术语。这种方法使您可以最大程度地控制处理拼写错误的过程,但也要求您事先了解术语的不同拼写错误。如果您想试验同义词,可以使用这些docs

    【讨论】:

    • 感谢您的回复。我已经用您要求的详细信息更新了帖子。分析 API 输出的行为与您提到的方式不同。关于其他选项 - 我将尝试其他编码器;但模糊没有帮助;同义词和语音似乎并没有齐头并进(请参阅我创建的与此问题相关的另一篇文章 [Link] (stackoverflow.com/q/54576138/10142703))
    【解决方案2】:

    正如您在我的帖子中看到的那样;我的目标是处理错别字。

    唯一简单的选择是使用内置的 Lucene 功能 - 模糊搜索。我还没有检查响应时间,因为查询类型必须设置为“完整”才能使用模糊搜索。否则,结果是令人满意的。

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

    更多阅读请转至Documentation

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 2012-02-26
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多