【问题标题】:azure search exact match of file name not returning exact results文件名的天蓝色搜索完全匹配不返回确切结果
【发布时间】:2023-04-08 20:54:01
【问题描述】:

我将所有文件名编入索引。但是,当我在搜索查询中使用确切的文件名进行搜索时,它也会返回所有其他文件名。下面是我的索引定义。

{
  "fields": [
    {
      "name": "id",
      "type": "Edm.String",
      "facetable": true,
      "filterable": true,
      "key": true,
      "retrievable": true,
      "searchable": false,
      "sortable": false,
      "analyzer": null,
      "indexAnalyzer": null,
      "searchAnalyzer": null,
      "synonymMaps": [],
      "fields": []
    },
    {
      "name": "FileName",
      "type": "Edm.String",
      "facetable": false,
      "filterable": false,
      "key": false,
      "retrievable": true,
      "searchable": true,
      "sortable": false,
      "analyzer": "keyword-analyzer",
      "indexAnalyzer": null,
      "searchAnalyzer": null,
      "synonymMaps": [],
      "fields": []
    }
  ],
  "scoringProfiles": [],
  "defaultScoringProfile": null,
  "corsOptions": null,
  "analyzers": [
            {
                "name": "keyword-analyzer",
                "@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
                "charFilters": [],
                "tokenizer": "keyword_v2",
                "tokenFilters": ["lowercase", "my_asciifolding", "my_word_delimiter"]
            }
        ],
        "tokenFilters": [
            {
                "@odata.type": "#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
                "name": "my_asciifolding",
                "preserveOriginal": true
            },
            {
                "@odata.type": "#Microsoft.Azure.Search.WordDelimiterTokenFilter",
                "name": "my_word_delimiter",
                "generateWordParts": true,
                "generateNumberParts": false,
                "catenateWords": false,
                "catenateNumbers": false,
                "catenateAll": false,
                "splitOnCaseChange": true,
                "preserveOriginal": true,
                "splitOnNumerics": true,
                "stemEnglishPossessive": false,
                "protectedWords": []
            }
        ],
  "@odata.etag": "\"0x8D6FB2F498F9AD2\""
}

以下是我的示例数据

{
  "value": [
    {         
      "id": "1",
      "FileName": "SamplePSDFile_1psd2680.psd"
    },
    {  
       "id": "2",
      "FileName": "SamplePSDFile-1psd260.psd"
    }, 
    {  
      "id": "3",
      "FileName": "SamplePSDFile_1psd2689.psd"
    }, 
    {  
      "id": "4",  
      "FileName": "SamplePSDFile-1psdxx2680.psd"
    }
  ]  
}

以下是分析 API 结果

{    
    "tokens": [
        {
            "token": "samplepsdfile_1psd2689.psd",
            "startOffset": 0,
            "endOffset": 26,
            "position": 0
        },
        {
            "token": "samplepsdfile",
            "startOffset": 0,
            "endOffset": 13,
            "position": 0
        },
        {
            "token": "psd",
            "startOffset": 15,
            "endOffset": 18,
            "position": 1
        },
        {
            "token": "psd",
            "startOffset": 23,
            "endOffset": 26,
            "position": 2
        }
    ]
}

当我使用关键字"SamplePSDFile_1psd2689.psd" 进行搜索时,Azure 搜索会在结果中返回三条记录,而不仅仅是文档 3。下面是我的搜索查询和结果。

?search="SamplePSDFile_1psd2689.psd"&api-version=2019-05-06&$count=true&queryType=full&searchMode=All

{   
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 2.3387241,
            "id": "2",
            "FileName": "SamplePSDFile-1psd260.psd"
        },
        {
            "@search.score": 2.2493405,
            "id": "3",
            "FileName": "SamplePSDFile_1psd2689.psd"
        },
        {
            "@search.score": 2.2493405,
            "id": "1",
            "FileName": "SamplePSDFile_1psd2680.psd"
        }
    ]
}

我怎样才能达到我的预期结果。我尝试在关键字所有其他选项周围使用和不使用双引号,但没有运气。在这种情况下我做错了什么?

有人建议使用 $filter,但在我们的案例中该字段不可过滤。

请帮帮我。

【问题讨论】:

    标签: lucene azure-cognitive-search


    【解决方案1】:

    如果您正在寻找完全匹配,那么您可能不希望涉及任何分析器。试试这条线

    "analyzer": "keyword-analyzer"

    改为

    "analyzer": null

    如果您需要能够对字段进行完全匹配并且还支持部分关键字搜索,那么您需要使用不同的名称对该字段进行两次索引。也许将“Exact”附加到完全匹配的字段名称,并且不要使用分析器。没有确切的名称可以有一个分析器。然后根据搜索类型使用正确的字段名称索引在字段上进行搜索。

    【讨论】:

    • 完全匹配也是要求之一。我也想要关键字和部分搜索。这就是我使用自定义分析器的原因。如果我在没有分析器的情况下再添加一个名称字段,则会出现重复内容。
    • @SudhakarReddy 记得接受我的回答,如果它回答了您的问题,请点赞。
    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多