我想实现这样的搜索逻辑:“给我索引中的所有与我的术语相匹配的文章,并且更喜欢某个类别的文章”。
在弹性搜索中,可以使用“应该”布尔查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html来实现这一点。
子句(查询)是否应该出现在匹配的文档中。
但我不知道如何在Azure认知搜索中实现这一点。一种选择是搜索不属于类别的所有文章,然后搜索所有不在类别中的文章,并在评分的基础上建立某种全球秩序。
有内置功能吗?
发布于 2021-11-04 19:55:33
您应该能够通过使用允许在过滤器表达式中编写全文搜索的search.ismatchscoring来实现所需的行为。
此筛选器表达式将确保skateboards位于Title中,并在Category中搜索sports以帮助评分,但由于or语句,它仍将返回其他类别的文档:
search.ismatchscoring('skateboards', 'Title') and (search.ismatchscoring('sports', 'Category') or search.ismatchscoring('*'))
发布于 2021-11-05 13:50:30
您所要求的是通过名为术语助推在Azure搜索的功能来支持的。在您的示例中,您有一些必须存在的搜索词。但是,你实际上不知道这些术语是否在你心目中的某个类别中找到。如果他们这样做了,你会想把这些提升到顶端。
用例
假设你有一个包含音乐的索引。使用以下索引规范(例如,简化)。
{
"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"
    }
]}
现在,假设你在寻找这首歌,我们将摇滚你。如果你只是简单地搜索这些条款,你会得到两次点击。注意,与类型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"
        }
    ]
}在您的例子中,您更喜欢特定类别的内容。翻译成这个例子,假设你真的更喜欢古典风格的热门歌曲。您可以使用过滤器来构造查询,如下所示。
我们将震撼你的流派:“古典”
因为你是过滤,你只会得到一个命中。注意,分数现在也更高了。
{
"@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) OR (we will rock you Genre:"Classical"^10)这会产生两个结果,上面是经典版本。
    "@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://stackoverflow.com/questions/69843991
复制相似问题