Azure搜索


如果您的任何项目使用存储在Azhurov数据库中的数据,那么您很有可能有机会通过Azure搜索使用数据搜索。 您不仅可以按数据库(Azure Cosmos DB,Azure SQL数据库,Azure VM中托管的SQL Server)进行搜索,还可以按Blob(Azure Blob存储,Azure表存储)进行搜索。


搜索具有免费资费,您最多可以创建三个索引,总大小最大为50 Mb。 免费套餐不具有负载均衡功能,但非常适合使用。


对我来说,处理搜索似乎很简单(尽管并不总是很明显)。 有3种类型的对象:数据源,索引和索引器。 也许主要的对象是索引。 正是他负责如何搜索以及准确查找什么内容。 数据源是数据连接,而索引器是更新索引数据的作业。


门户用户界面允许您导入数据并创建所有三个对象。 机会将过去,并为搜索增加认知能力。 如果SQL数据库在预订中,则可以在创建数据源时选择它。 尽管密码由于某种原因而仍然需要输入。 如果要使用Cosmos DB,则需要手动输入连接字符串。 不要忘了在行和数据库中指明,在行末添加Database = YOUR_BASE_NAME


选择数据源后,系统将提示您使用认知搜索功能。 默认技能集仍然很小:您可以定义语言,提取名称,组织名称,地点和关键短语。 还有一个有趣的机会,可以使用情绪检测来确定正面或负面情绪的文本性质。 此技能应便于在线商店中的产品评论中使用。 可以使用API​​描述创建自己的技能



对于上传到Blob的文件,可以使用OCR(光学字符识别)。 可以识别手写(到目前为止仅英语)和印刷文本。 使用认知服务,可以识别照片中的各种对象。 例如,著名的地方或名人。


下一步是创建索引。 今天搜索模式的唯一选项是“ analyzingInfixMatching”



此时,您可以选中表中字段旁边的框,或向索引中添加一些新字段。 以防万一,我将解释这些领域的可能性:


可检索 -该字段将出现在搜索结果中
可过滤 -可以过滤字段值
可排序 -您可以按此字段对结果进行排序
Facetable-根据某些特征的分组。 例如,使用以下表达式facet = listPrice,值:10 | 25 | 100 | 500 | 1000 | 2500,可以将以下结果细分为组



可搜索 -此字段将搜索


分析器字段建议为各种语言选择分析器。 使用2个版本-LuceneMicrosoft 。 为了了解区别是什么,您需要了解以下两个术语之间的区别:


词干是为给定源单词找到单词基础的过程。 茎(英语)-茎,茎,起源。 词干使用算法。 通常会通过删除后缀和结尾来截断单词,从而获得单词的基础。
合法化是将单词形式简化为引理的过程-它的常规(词汇)形式。 引理是单词的规范的基本形式。 词法化使用包含各种形式的单词的字典搜索。


Lucene分析仪使用词干。 Microsoft分析器使用lemmatization。
默认情况下,如果未选择任何选项,则使用Lucene。 但是,如果您要查找特定语言的数据,那么最好使用针对该语言的分析器。


推荐器 -允许您使用搜索的首字母对包含输入文本的文档进行提示。


如果要在客户端应用程序的Azure搜索中使用探针,则将有2个使用它的选项: 亲本本身或autocomplete 。 简而言之,提示会提示您完全来自表字段的整个行,而自动完成功能仅提供从几个单词中完成一个单词或一个表达式的功能。 下一篇文章中介绍了有关提示和自动完成模式之间差异的最佳文章: Azure上的自动完成现在可以在公共预览版中进行搜索本文包含非常直观的gif。


在创建索引器的阶段必须指定高水印列 。 每次更改记录时,此字段都会更改。 通常,这类似于带有最后更改日期的字段或Cosmos DB中的_ts字段。 在索引编制过程中,如果字段值更改,则索引也将更改。



跟踪删除是一种从索引中自动删除条目的选项。 但是为此,您必须在数据库中配置软删除。 如果使用软删除,则在删除记录时,不会删除该记录,而只是将其标记为已删除。 标准选项是将isDeleted字段添加到数据库,并在删除记录时将其设置为true。
另外,每次从数据库中删除条目时,都可以将搜索中的删除请求发送到Azure搜索API。 在这种情况下,可以删除“删除Trak”复选框。 但我不太喜欢这个选项,因为如果删除请求无效,则记录将保留在索引中。 对于我来说,没有足够的机会在一定时间内完全重建一次索引。


尽管门户网站非常方便,但是创建门户后,您可以向索引添加一些新字段,但是无法更改现有字段。 如果需要更改,该怎么办? 您可以重新创建索引。 删除现有的,并创建一个包含必要更改的新文件。 使用门户网站执行此任务是一项沉闷的工作。 我将API用于这些目的。 使用Postman之类的应用程序,您可以获取索引JSON并使用它编写索引创建请求。 只需要进行少量更改(例如,删除系统字段“ @ odata.context”和“ @ odata.etag”)。


为了使用API​​,您需要从门户获取密钥,该密钥必须添加到每个API请求的标头中。 密钥在这里获取:



获取索引数据的查询是:


GET https://[service name].search.windows.net/indexes/[index name]?api-version=[api-version] 

必须将api-key: [admin key]添加到标题中api-key: [admin key]


使用以下两个查询之一可以创建索引


 POST https://[servicename].search.windows.net/indexes?api-version=[api-version] Content-Type: application/json api-key: [admin key] 


 PUT https://[servicename].search.windows.net/indexes/[index name]?api-version=[api-version] 

在正文中,您必须使用索引内容指定JSON。 当前的最新版本是2019-05-06,并且在长时间使用之前2017-11-11


通过API,您可以使用门户网站上不可用的一些搜索功能。


为了使某些字段在搜索中具有优先权,您可以使用评分配置文件


添加到请求中的以下JSON使“ title”字段比“ info”字段具有双重优势:


 "scoringProfiles": [ { "name": "profileForTitle", "document": { "weights": { "title": 2, “info": 1 } } ] 

除了可以使用权重为某些字段赋予优先权之外,还可以使用一些预定义的功能:新鲜度,大小,距离和标签。


新鲜度仅与DateTime字段一起使用,并允许您在搜索中显示最新记录。 大小用于int和double字段。 很好,因此,此功能可用于存储价格,下载次数和其他数字信息的字段。 距离仅与Edm.GeographyPoint之类的字段一起使用,并在搜索中根据距特定位置的距离来提高距离。 如果将tag指定为函数类型,则将在搜索中引发包含出现在搜索字符串中的标记的文档。


最受欢迎的选项之一是在这样的搜索中获取最新文档:


 "scoringProfiles": [{ "name":"newDocs", "functions": [ { "type": "freshness", "fieldName": "documentDate", "boost": 10, "interpolation": "quadratic", "freshness": { "boostingDuration": "P7D" } } ] } ] 

其documentDate字段包含最近7天的日期(“ P7D”)的文档将被提出。


创建评分资料后,您可以在请求中指定其名称。 只有在这种情况下,才会在搜索中引发必填字段。


在官方文档中了解更多信息: 将评分配置文件添加到Azure搜索索引


数据变更检测策略


该API为数据源提供了更多功能。 如上文所述,在创建数据源时,您可以指定一个字段来确定数据是否已更改。 以JSON的形式,它看起来像这样:


 "dataChangeDetectionPolicy" : { "@odata.type" : "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy", "highWaterMarkColumnName" : "[a rowversion or last_updated column name]" }        soft delete     policy: "dataDeletionDetectionPolicy" : { "@odata.type" : "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy", "softDeleteColumnName" : "IsDeleted", "softDeleteMarkerValue" : "true" } 

如果使用SQL Server,并且数据库支持更改跟踪,则可以自动从索引中删除已删除的记录。 在这种情况下,不需要指定highWaterMarkColumnName。 指定SqlIntegratedChangeTrackingPolicy而不是HighWaterMarkChangeDetectionPolicy就足够了


 "dataChangeDetectionPolicy" : { "@odata.type" : "#Microsoft.Azure.Search.SqlIntegratedChangeTrackingPolicy" } 

非常方便。 但是有些细微差别不允许您完全享受此功能。


首先,SqlIntegratedChangeTrackingPolicy不能与视图一起使用。 其次,该表不应具有复合主键。 不言而喻,SQL Server的版本必须或多或少是新的。 最后,必须为搜索所使用的数据库和表启用更改跟踪。 对于数据库,它是这样打开的:


 ALTER DATABASE AdventureWorks2012 SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) 

对于这样的表:


 ALTER TABLE Person.Contact ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON) 

但这还不是全部。 强烈建议您为基础启用快照隔离。


 ALTER DATABASE AdventureWorks2012 SET ALLOW_SNAPSHOT_ISOLATION ON; 

为我安装数据库的“变更跟踪”时,除了铃鼓起舞之外,缺点是无法使用视图。 所以我通常还是必须使用HighWaterMarkChangeDetectionPolicy


资料搜寻


默认情况下,Azure搜索使用简单的查询语法 。 看起来并不奇怪,但它很简单:


wifi +奢侈品会同时搜索wifi和奢侈品一词
“豪华酒店”正在寻找短语
wifi | 奢侈品正在寻找“ wifi”一词或“奢侈品”一词
wifi –luxury搜索带有wifi词但没有豪华词的文本
lux搜索以lux开头的单词


可以使用括号组合搜索规则。 例如,“ 汽车旅馆+(wifi |豪华)”规则搜索“汽车旅馆”一词,然后搜索“ wifi”或“豪华”一词。


Azure搜索可以使用Lucene语法很好。 为了使用它,有必要将queryType = full添加搜索查询中


Azure和经典Lucene语法之间的区别仅在于没有范围。


因此,在Azure搜索中,您不能: mod_date:[20020101 TO 20030101]


但是在Azure搜索中,可以将$过滤器与ODATA语法一起使用。 这是一个示例过滤器:


 { "name": "Scott", "filter": "(age ge 25 and and lt 50) or surname eq 'Guthrie'" } 

过滤器也可以与简单的查询语法一起使用。


在Lucene中,逻辑“或”是使用OR||实现的
这两个值都可以通过指定“ and”语句来找到: AND&&+
对于“不”,您可以使用以下之一: 不,!-


“ not”指令具有简单语法和Lucene的共同特征。 它的行为取决于搜索模式,可以在searchMode = allsearchMode = any中设置此值(默认情况下使用此值)。 在任何模式下,搜索wifi -luxury都会找到带有wifi单词的文档或没有带有luxux单词的文档。 在全模式下,根据相同的请求,它将找到带有wifi字样的基座,同时没有带有豪华字样的基座。


让我们看一些有趣的Lucene功能。


模糊搜索使您可以搜索与一个或多个字母不同的单词。 也就是说,它有助于处理错别字。 例如,搜索“ blue〜”或“ blue〜1”将为您返回“ blue”和“ blues”,甚至是“ glue”。 但同时,搜索“企业〜分析师”将意味着企业或分析师
接近允许您搜索附近的单词。 例如,“酒店机场”〜5会在文本中找到彼此不超过5个单词的单词“酒店”和“机场”。
字词增强功能可让设置搜索中单词的优先级。 示例:“ rock ^ 2 electronic”搜索“ rock and electronic”一词,但搜索中带有“ rock”一词的条目将显示在上方。
正则表达式 -使用正则表达式。 这里的所有内容均与Lucene regex官方文档一致。 您可以通过以下链接找到她。 搜索时,必须在正斜杠“ /”之间放置正则表达式。 例如,像这样:/ [mh] otel /


如果您的搜索字符串包含特殊字符,则必须使用反斜杠对它们进行转义。 要转义的示例字符: +-&& ||! (){} [] ^“〜* ?: \ /
可以使用GET请求进行搜索。 官方示例是这样的:


 GET /indexes/hotels/docs?search=category:budget AND \"recently renovated\"^3&searchMode=all&api-version=2019-05-06&querytype=full 

但是您可以将POST请求与body一起使用。 再次,一个官方示例:


 POST /indexes/hotels/docs/search?api-version=2019-05-06 { "search": "category:budget AND \"recently renovated\"^3", "queryType": "full", "searchMode": "all" } 

如果您使用数据类型为application / x-www-form-urlencoded的GET请求或POST,则需要对不安全和保留的字符进行编码。


符号 /?:@ =&保留
字符``<>#%{} | \ ^〜[]不安全。
例如,符号#将变为%23,而符号? 变成%3F


开发人员的几个链接。


如果.NET是开发人员,则可以使用Microsoft.Azure.Search NuGet程序包;此外, NodeJSJava中还提供了示例。


.NET Core上的简单应用程序示例,您可以在这里找到ASP.NET Core Azure搜索示例

Source: https://habr.com/ru/post/zh-CN454820/


All Articles