如果您提供数据示例、索引和查询方式的示例,我会提供帮助。发生了什么,您有什么期待?
标准的 lucene 分析器将适用于您的 user@domain.com 示例。它生成令牌 user 和 domain.com 是正确的。但是,当您查询时也会发生同样的情况,您将获得带有标记 user 和 domain.com 的记录。
创建索引
"fields": [
{"name": "Id", "type": "Edm.String", "searchable": false, "filterable": true, "retrievable": true, "sortable": true, "facetable": false, "key": true, "indexAnalyzer": null, "searchAnalyzer": null, "analyzer": null, "synonymMaps": [] },
{"name": "Email", "type": "Edm.String", "filterable": true, "sortable": true, "facetable": false, "searchable": true, "analyzer": "standard"}
]
上传
{
"value": [
{
"@search.action": "mergeOrUpload",
"Id": "1",
"Email": "user@domain.com"
},
{
"@search.action": "mergeOrUpload",
"Id": "2",
"Email": "some.user@some-domain.com"
},
{
"@search.action": "mergeOrUpload",
"Id": "3",
"Email": "another@another.com"
}
]
}
查询
查询,使用 full 和 all。
https://{{SEARCH_SVC}}.{{DNS_SUFFIX}}/indexes/{{INDEX_NAME}}/docs?search=user@domain.com&$count=true&$select=Id,Email&searchMode=all&queryType=full&api-version={{API-VERSION}}
按预期产生结果(包含 user 和 domain.com 的所有记录):
{
"@odata.context": "https://<your-search-env>.search.windows.net/indexes('dg-test-65392234')/$metadata#docs(*)",
"@odata.count": 2,
"value": [
{
"@search.score": 0.51623213,
"Id": "1",
"Email": "user@domain.com"
},
{
"@search.score": 0.25316024,
"Id": "2",
"Email": "some.user@some-domain.com"
}
]
}
如果您的预期结果是只获得电子邮件完全匹配的上述记录,您可以改用短语搜索。 IE。用 search="user@domain.com" 替换上面的搜索参数,你会得到:
{
"@search.score": 0.51623213,
"Id": "1",
"Email": "user@domain.com"
}
您也可以使用关键字分析器。
分析
您可以通过 REST 直接比较不同的分析器。在 Email 属性上使用关键字分析器将生成一个标记。
{
"text": "some-user@some-domain.com",
"analyzer": "keyword"
}
产生以下标记:
"tokens": [
{
"token": "some-user@some-domain.com",
"startOffset": 0,
"endOffset": 25,
"position": 0
}
]
与对大多数类型的非结构化内容做得不错的标准标记器相比。
{
"text": "some-user@some-domain.com",
"analyzer": "standard"
}
对于电子邮件地址是某些通用文本的一部分的情况,这会产生合理的结果。
"tokens": [
{
"token": "some",
"startOffset": 0,
"endOffset": 4,
"position": 0
},
{
"token": "user",
"startOffset": 5,
"endOffset": 9,
"position": 1
},
{
"token": "some",
"startOffset": 10,
"endOffset": 14,
"position": 2
},
{
"token": "domain.com",
"startOffset": 15,
"endOffset": 25,
"position": 3
}
]
摘要
这已经是一个很长的答案,所以我不会详细介绍您的其他两个问题。我建议将它们拆分为单独的问题,以便其他人受益。
-
HTML 内容:简而言之,您可以使用去除 HTML 标记的内置 HTML 分析器。或者您可以使用自定义代码自己剥离 HTML。我通常将 Beautiful Soup 用于此类用例,或者将简单的正则表达式用于更简单的情况。
-
通配符搜索:通常用户不希望附加自动通配符。执行此操作的唯一应用程序是 Outlook 客户端,它会破坏精度。当我搜索“Jan”(一个通用名称)时,我烦人地收到所有在一月份发送的电子邮件(!)。搜索 Dan(同样是一个名字)我还收到了来自 Danmark(丹麦)的所有电子邮件。
搜索中的一切都是准确率和召回率之间的权衡。在您使用电子邮件地址的第一个示例中,您的期望非常注重精确度。但是,在您的最后一个通配符问题中,您似乎更喜欢在所有内容上都使用通配符进行极端回忆。这一切都取决于您的期望。