【问题标题】:Azure Search Normalized Lowercase FieldAzure 搜索规范化小写字段
【发布时间】:2022-02-11 03:25:27
【问题描述】:

我无法将“标题”字段的规范化副本添加到我们的搜索索引中。最终,我尝试将此字段用于不区分大小写的顺序。目前,标题按以下顺序返回($orderBy=TitleCaseInsensitive):

  1. Abc
  2. 英国广播公司
  3. abc

而我想要的是:Abc->abc->Bbc。我已经通过字段映射将“标题”字段分成两个字段,然后将带有“小写”标记过滤器的自定义分析器应用于规范化字段。有人可以解释为什么我没有得到想要的结果吗?以下是索引定义的相关部分:

"index":{
    "name": "current-local-inventory",  
    "fields": [
        {"name": "TitleCaseInsensitive","indexAnalyzer":"caseInsensitiveAnalyzer","searchAnalyzer":"keyword", "type": "Edm.String","filterable": false, "sortable": true, "facetable": false, "searchable": true},
        {"name": "Title", "type": "Edm.String","filterable": true, "sortable": true, "facetable": false, "searchable": true},
    ],
    "analyzers": [
        {
            "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
            "name":"caseInsensitiveAnalyzer",
            "charFilters":[],
            "tokenizer":"keyword_v2",
            "tokenFilters":["lowercase"]
        }
      ]
},
"indexers":[{
    "fieldMappings" : [
        {"sourceFieldName" : "Title", "targetFieldName" : "Title" },
        {"sourceFieldName" : "Title", "targetFieldName" : "TitleCaseInsensitive" }
    ]
}]

【问题讨论】:

    标签: azure-cognitive-search


    【解决方案1】:

    在相关帖子Azure Search - Accent insensitive analyzer not working when sorting 中查看我的答案。当您包含小写标记过滤器时,它只会影响搜索而不影响排序。见Azure Search User Voice entry Case-insensitive sorting for string fields

    我在相关帖子中解释的建议解决方法是创建一个分叉/阴影属性。但是,使用带有小写标记过滤器的分析器将无济于事。我能让你的例子工作的唯一方法是包含一个已经小写的 Title 属性的副本。请注意,我没有使用 fieldMapping,也没有像您在示例中那样使用不同的分析器进行索引和搜索。

    创建索引

    创建索引。将尖括号中的变量替换为适合您的环境。

    {
    "@odata.context": "https://{{SEARCH_SVC}}.{{DNS_SUFFIX}}/$metadata#indexes/$entity",
    "@odata.etag": "\"0x8D8761DCBBCCD00\"",
    "name": "{{INDEX_NAME}}",
    "defaultScoringProfile": null,
    "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": "TitleCaseInsensitive","indexAnalyzer": null, "searchAnalyzer": null, "analyzer": "caseInsensitiveAnalyzer", "type": "Edm.String","filterable": false, "sortable": true, "facetable": false, "searchable": true},
        {"name": "Title", "type": "Edm.String","filterable": true, "sortable": true, "facetable": false, "searchable": true}
    ],  
    "scoringProfiles": [],
    "corsOptions": null,
    "suggesters": [],
    "analyzers": [        {
            "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
            "name":"caseInsensitiveAnalyzer",
            "charFilters":[],
            "tokenizer":"keyword_v2",
            "tokenFilters":["lowercase"]
        }],
    "tokenizers": [],
    "tokenFilters": [],
    "charFilters": [],
    "encryptionKey": null
    

    }

    上传

    上传三个示例文档。

    {
        "value": [
            {
                "@search.action": "mergeOrUpload",
                "Id": "1",
                "Title": "Abc",
                "TitleCaseInsensitive": "abc"
            },
            {
                "@search.action": "mergeOrUpload",
                "Id": "2",
                "Title": "abc",
                "TitleCaseInsensitive": "abc"
            },
            {
                "@search.action": "mergeOrUpload",
                "Id": "3",
                "Title": "Bbc",
                "TitleCaseInsensitive": "bbc"
            }
        ]
    }
    

    查询

    然后,在您的小写(规范化)属性上使用 $orderby 进行查询。

    https://{{SEARCH_SVC}}.{{DNS_SUFFIX}}/indexes/{{INDEX_NAME}}/docs?search=*&$count=true&$select=Id,Title,TitleCaseInsensitive&searchMode=all&queryType=full&api-version={{API-VERSION}}&$orderby=TitleCaseInsensitive asc

    如果标题以不区分大小写的方式排序,您将获得预期的结果。

    {
    "@odata.context": "https://<your-search-service>.search.windows.net/indexes('dg-test-65526118')/$metadata#docs(*)",
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 1.0,
            "Id": "2",
            "TitleCaseInsensitive": "abc",
            "Title": "abc"
        },
        {
            "@search.score": 1.0,
            "Id": "1",
            "TitleCaseInsensitive": "abc",
            "Title": "Abc"
        },
        {
            "@search.score": 1.0,
            "Id": "3",
            "TitleCaseInsensitive": "bbc",
            "Title": "Bbc"
        }
    ]
    

    }

    我很想用一种简单的方法来纠正它。

    【讨论】:

    • 不幸的是,我无法将小写字段添加到我的数据源中。即使我可以,当我们试图支持额外的可排序字段时,它也会变得站不住脚。我需要通过将数据源字段分叉到索引文档中的两个字段来找到一种方法
    • 好的。当您说数据源时,您的意思是您使用 Azure 搜索索引器和门户中定义的数据源吗?如何将数据放入索引很重要。如果使用 Azure 搜索索引器,则可以定义自定义处理管道。如果您通过 SDK 提交,您将无法使用内置的扩充管道,但您显然可以进行任何您想要的处理。
    • 该处理称为Skillset。抱歉,不记得它的实际名称了。
    • 我确实使用了索引器,是的。有数据来自的 SQL 视图和针对它运行的索引器
    【解决方案2】:

    请查看预览版中的Text normalization for case-insensitive filtering, faceting and sorting 功能。

    您可以更新您的索引,以对您希望在其中进行不区分大小写的排序操作的字段使用此“规范化器”功能。

    您不再需要单独的字段TitleCaseInsensitive。您可以将"normalizer": "lowercase" 添加到Title 字段,$orderBy=Title 将按照您想要的顺序排序,忽略大小写。

    “小写”规范化器是预定义的。如果您想应用其他过滤器,请查看predefined and custom normalizers

    "index": {
        "name": "current-local-inventory",  
        "fields": [
            {"name": "Title", "type": "Edm.String", "filterable": true, "sortable": true, "facetable": false, "searchable": true, "normalizer":"lowercase"}
        ]
    },
    "indexers":[{
        "fieldMappings" : [
            {"sourceFieldName" : "Title", "targetFieldName" : "Title" }
        ]
    }]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      相关资源
      最近更新 更多