我可以在 Azure 认知搜索中使用可选筛选器吗
Can I use optional filters in Azure Cognitive Search
我想实现这样的搜索逻辑“给我索引中与我的词匹配的所有文章,并优先选择某个类别的文章”。
在弹性搜索中,可以使用“应该”布尔查询来实现:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
should The clause (query) should appear in the matching document.
但我不确定如何在 Azure 认知搜索中实现它。一种选择是搜索所有不属于该类别的文章,然后搜索所有属于该类别的文章,并根据评分进行某种全局排序。
是否有内置功能?
您应该能够通过使用允许在过滤器表达式中编写全文搜索的 search.ismatchscoring 来实现所需的行为。
此过滤器表达式将确保 skateboards
在 Title
中并在 Category
中搜索 sports
以有助于评分,但它仍然会 return 其他类别的文档由于 or
语句:
search.ismatchscoring('skateboards', 'Title') and (search.ismatchscoring('sports', 'Category') or search.ismatchscoring('*'))
通过 Azure 搜索中名为 Term Boosting 的功能支持您的要求。在您的示例中,您有一些必须存在的搜索词。但是,您实际上并不知道这些术语是否在您想到的类别中。如果他们这样做,您想将它们提升到顶部。
- 您的搜索字词是一个过滤器,用于确定是否应包含一篇文章。
- 您要求的类别是首选。
用例
假设您有一个音乐索引。您使用以下索引规范(例如已简化)。
{
"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": "Title", "type": "Edm.String", "searchable": true, "filterable": true},
{"name": "Genre", "type": "Edm.String", "searchable": true, "filterable": true},
{"name": "Artist", "type": "Edm.String", "searchable": true, "filterable": true}
],
}
索引包含以下项目。
{
"value": [
{
"@search.action": "mergeOrUpload",
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
},
{
"@search.action": "mergeOrUpload",
"Id": "2",
"Title": "We will rock you",
"Genre": "Rock",
"Artist": "Queen"
},
{
"@search.action": "mergeOrUpload",
"Id": "3",
"Title": "Bohemian Rhapsody",
"Genre": "Rock",
"Artist": "Queen"
}
]
}
现在,假设您正在寻找歌曲 we will rock you。如果您只是搜索这些术语,您会得到两次匹配。请注意,类型为 Rock 的项目得分更高。这是因为您的搜索词 rock 的词频。摇滚既出现在流派中,也出现在标题中。
{
"@odata.count": 2,
"value": [
{
"@search.score": 1.4384104,
"Id": "2",
"Title": "We will rock you",
"Genre": "Rock",
"Artist": "Queen"
},
{
"@search.score": 1.1507283,
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
}
]
}
在您的情况下,您更喜欢来自特定类别的内容。翻译成这个例子,假设你真的更喜欢古典类型的热门歌曲。您可以像这样使用过滤器构建查询。
我们会震撼你流派:“古典”
由于您正在过滤,因此您只会获得 1 次匹配。请注意,分数现在也更高了。
{
"@odata.count": 1,
"value": [
{
"@search.score": 1.4384104,
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
}
]}
如果您应用提升,比如提升 10 倍,您会看到分数增加。例如
我们会摇滚你流派:“古典”^10
{
"@odata.count": 1,
"value": [
{
"@search.score": 4.0275493,
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
}
]}
但是,假设您不知道是否有不同类型的多个版本。你想要的是'we will rock you'的所有版本,但如果有来自古典类型的热门,那就是你喜欢的。这是一个不同的问题(以及你在问我的解释是否正确)。
(we will rock you) OR (we will rock you Genre:"Classical"^10)
这会产生 2 个结果,经典版本在最上面。
"@odata.count": 2,
"value": [
{
"@search.score": 5.1782775,
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
},
{
"@search.score": 1.4384104,
"Id": "2",
"Title": "We will rock you",
"Genre": "Rock",
"Artist": "Queen"
}
]
我想实现这样的搜索逻辑“给我索引中与我的词匹配的所有文章,并优先选择某个类别的文章”。
在弹性搜索中,可以使用“应该”布尔查询来实现:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
should The clause (query) should appear in the matching document.
但我不确定如何在 Azure 认知搜索中实现它。一种选择是搜索所有不属于该类别的文章,然后搜索所有属于该类别的文章,并根据评分进行某种全局排序。
是否有内置功能?
您应该能够通过使用允许在过滤器表达式中编写全文搜索的 search.ismatchscoring 来实现所需的行为。
此过滤器表达式将确保 skateboards
在 Title
中并在 Category
中搜索 sports
以有助于评分,但它仍然会 return 其他类别的文档由于 or
语句:
search.ismatchscoring('skateboards', 'Title') and (search.ismatchscoring('sports', 'Category') or search.ismatchscoring('*'))
通过 Azure 搜索中名为 Term Boosting 的功能支持您的要求。在您的示例中,您有一些必须存在的搜索词。但是,您实际上并不知道这些术语是否在您想到的类别中。如果他们这样做,您想将它们提升到顶部。
- 您的搜索字词是一个过滤器,用于确定是否应包含一篇文章。
- 您要求的类别是首选。
用例
假设您有一个音乐索引。您使用以下索引规范(例如已简化)。
{
"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": "Title", "type": "Edm.String", "searchable": true, "filterable": true},
{"name": "Genre", "type": "Edm.String", "searchable": true, "filterable": true},
{"name": "Artist", "type": "Edm.String", "searchable": true, "filterable": true}
],
}
索引包含以下项目。
{
"value": [
{
"@search.action": "mergeOrUpload",
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
},
{
"@search.action": "mergeOrUpload",
"Id": "2",
"Title": "We will rock you",
"Genre": "Rock",
"Artist": "Queen"
},
{
"@search.action": "mergeOrUpload",
"Id": "3",
"Title": "Bohemian Rhapsody",
"Genre": "Rock",
"Artist": "Queen"
}
]
}
现在,假设您正在寻找歌曲 we will rock you。如果您只是搜索这些术语,您会得到两次匹配。请注意,类型为 Rock 的项目得分更高。这是因为您的搜索词 rock 的词频。摇滚既出现在流派中,也出现在标题中。
{
"@odata.count": 2,
"value": [
{
"@search.score": 1.4384104,
"Id": "2",
"Title": "We will rock you",
"Genre": "Rock",
"Artist": "Queen"
},
{
"@search.score": 1.1507283,
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
}
]
}
在您的情况下,您更喜欢来自特定类别的内容。翻译成这个例子,假设你真的更喜欢古典类型的热门歌曲。您可以像这样使用过滤器构建查询。
我们会震撼你流派:“古典”
由于您正在过滤,因此您只会获得 1 次匹配。请注意,分数现在也更高了。
{
"@odata.count": 1,
"value": [
{
"@search.score": 1.4384104,
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
}
]}
如果您应用提升,比如提升 10 倍,您会看到分数增加。例如
我们会摇滚你流派:“古典”^10
{
"@odata.count": 1,
"value": [
{
"@search.score": 4.0275493,
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
}
]}
但是,假设您不知道是否有不同类型的多个版本。你想要的是'we will rock you'的所有版本,但如果有来自古典类型的热门,那就是你喜欢的。这是一个不同的问题(以及你在问我的解释是否正确)。
(we will rock you) OR (we will rock you Genre:"Classical"^10)
这会产生 2 个结果,经典版本在最上面。
"@odata.count": 2,
"value": [
{
"@search.score": 5.1782775,
"Id": "1",
"Title": "We will rock you",
"Genre": "Classical",
"Artist": "London Symphony"
},
{
"@search.score": 1.4384104,
"Id": "2",
"Title": "We will rock you",
"Genre": "Rock",
"Artist": "Queen"
}
]