【发布时间】:2017-01-10 21:49:39
【问题描述】:
我在 azure 搜索中有一个索引,其中包含名字和姓氏等个人数据。
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”放在顶部
-
可以分享分析仪的配置吗?