【问题标题】:How can I rank exact matches higher in azure search如何在天蓝色搜索中将精确匹配排名更高
【发布时间】:2017-01-10 21:49:39
【问题描述】:

我在 azure 搜索中有一个索引,其中包含名字和姓氏等个人数据。

当我使用类似的查询搜索 3 个字母的姓氏时,

rau&searchFields=LastName

/indexes/customers-index/docs?api-version=2016-09-01&search=rau&searchFields=LastName

名字 rau 找到了,但它的结尾很远。

{
"@odata.context": "myurl/indexes('customers-index')/$metadata#docs(ID,FirstName,LastName)",
"value": [
    {
        "@search.score": 8.729204,
        "ID": "someid",
        "FirstName": "xxx",
        "LastName": "Liebetrau"
    },
    {
        "@search.score": 8.729204,
        "ID": "someid",
        "FirstName": "xxx",
        "LastName": "Damerau"
    },
    {
        "@search.score": 8.729204,
        "ID": "someid",
        "FirstName": "xxx",
        "LastName": "Rau"

更多的是像“Liebetrau”、“Damerau”这样的名字。

有没有办法在顶部进行完全匹配?

编辑

使用 RestApi 查询索引定义

GET https://myproduct.search.windows.net/indexes('customers-index')?api-version=2015-02-28-Preview

返回姓氏

 "name": "LastName",
  "type": "Edm.String",
  "searchable": true,
  "filterable": true,
  "retrievable": true,
  "sortable": true,
  "facetable": true,
  "key": false,
  "indexAnalyzer": "prefix",
  "searchAnalyzer": "standard",
  "analyzer": null,
  "synonymMaps": []

编辑 1

分析器定义

      "scoringProfiles": [],
  "defaultScoringProfile": null,
  "corsOptions": null,
  "suggesters": [],
  "analyzers": [
    {
      "name": "prefix",
      "tokenizer": "standard",
      "tokenFilters": [
        "lowercase",
        "my_edgeNGram"
      ],
      "charFilters": []
    }
  ],
  "tokenizers": [],
  "tokenFilters": [
    {
      "name": "my_edgeNGram",
      "minGram": 2,
      "maxGram": 20,
      "side": "back"
    }
  ],
  "charFilters": []

编辑 2

最后指定一个我在查询时使用的 ScoringProfile

   {
    "name": "person-index",  
    "fields": [

       {
      "name": "ID",
      "type": "Edm.String",
      "searchable": false,
      "filterable": true,
      "retrievable": true,
      "sortable": true,
      "facetable": true,
      "key": true,
      "indexAnalyzer": null,
      "searchAnalyzer": null,
      "analyzer": null

    }
    ,
    {
      "name": "LastName",
      "type": "Edm.String",
      "searchable": true,
      "filterable": true,
      "retrievable": true,
      "sortable": true,
      "facetable": true,
      "key": false,
      "analyzer":  "my_standard"

    },
     {
      "name": "PartialLastName",
      "type": "Edm.String",
      "searchable": true,
      "filterable": true,
      "retrievable": true,
      "sortable": true,
      "facetable": true,
      "key": false,
      "indexAnalyzer": "prefix",
      "searchAnalyzer": "standard",
      "analyzer": null

    }
    ],
    "analyzers":[
    {
      "name":"my_standard",
      "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
      "tokenizer":"standard_v2",
      "tokenFilters":[ "lowercase", "asciifolding" ]
    },
    {
      "name":"prefix",
      "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
      "tokenizer":"standard_v2",
      "tokenFilters":[ "lowercase", "my_edgeNGram" ]
    }
  ],
  "tokenFilters":[
    {
      "name":"my_edgeNGram",
      "@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
      "minGram":2,
      "maxGram":20,
      "side": "back"
    }
  ],
  "scoringProfiles":[
  {
    "name":"exactFirst",
    "text":{
      "weights":{ "LastName":2, "PartialLastName":1 }     
    }
  }
]
}

【问题讨论】:

  • 您好 Mathias,我很惊讶“Liebetrau”之类的名称与您的查询“rau”匹配,因为您似乎在寻找确切的术语,而不是后缀。您是否在 LastName 字段上应用自定义分析器?你能分享你的完整请求和你得到的回应吗?
  • 你可能是对的。我自己没有创建索引,也无法使用新索引重现该行为。我想那是运气不好,或者我可以在某处看到分析器吗?当我在分析器选项卡上查看 azure 中的索引定义时,没有条目
  • 您可以在使用 REST API GET /indexes/?api-version=2016-09-01 查看索引定义时看到分析器。如果在 LastName 字段上使用标准分析器,我不希望姓氏不是“Rau”的文档匹配。
  • 你猜对了分析器就位。如果有人真的定义了它,或者默认情况下在创建索引分析器时使用数据源,我不确定。这解释了为什么返回所有 LastName 条目,但我仍然需要找到一种方法将项目“Rau”放在顶部
  • 可以分享分析仪的配置吗?

标签: azure-cognitive-search


【解决方案1】:

在 LastName 字段上设置的分析器“前缀”为名称 Liebetrau 生成以下术语:au, rau, trau, etrau, betrau, ebetrau, iebetrau, libetrau。这些是edge ngrams,从单词的后面开始,长度范围为 2 到 20,如索引定义中的 my_edgeNGram 标记过滤器中所定义。分析器将以相同的方式处理其他名称。 当您搜索名称 rau 时,它会匹配所有名称,因为它们都以这些字符结尾。这就是结果集中的所有文档都具有相同相关性分数的原因。

您可以使用Analyze API 测试您的分析仪配置。

要了解有关自定义分析器的更多信息,请转至 herehere

希望有帮助

【讨论】:

  • 谢谢你说清楚了。是否还有办法让搜索词的完全匹配更多地出现在顶部?
  • 我现在通过观看视频 channel9.msdn.com/Shows/Data-Exposed/… 看到了使用边缘 ngram 的想法来自哪里。这看起来是个好主意,因为它可以找到更多条目。我想我将有两个字段,其中一个由默认分析器查询,第二个由 ngram 查询。在客户端中,我会将结果与顶部的默认分析器结果结合起来。顺便说一句,你为虚拟学院制作的视频很棒!
  • 我发现您的文章解释了我的确切问题,您添加了评分配置文件以将完全匹配的排名更高。好的。 azure.microsoft.com/de-de/blog/custom-analyzers-in-azure-search
  • 很高兴听到,如果我能提供其他帮助,请告诉我。
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2018-03-06
  • 2023-04-08
  • 2015-10-27
  • 2016-09-26
  • 1970-01-01
  • 2015-05-18
  • 2015-10-09
相关资源
最近更新 更多