azure search exact match of file name not returning exact results

Viewed 183

I am indexing all the file names into the index. But when I search with exact file name in the search query it is returning all other file names also. below is my index definition.

{
  "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\""
}

Below is my sample data

{
  "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"
    }
  ]  
}

Below is the Analyze API results

{    
    "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
        }
    ]
}

When I search with the keyword "SamplePSDFile_1psd2689.psd", Azure search returning three records in the results instead of only document 3. Below is my search query and the results.

?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"
        }
    ]
}

How I can achieve my expected results. I tried with and without double quotes around the keyword all other options, but no luck. What I am doing wrong here in this case?

Some body suggested to use $filter, but that field wasn't filterable in our case.

Please help me on this.

1 Answers

If you are looking for exact match then you probably don't want any analyzer involved. Give it a try with this line

"analyzer": "keyword-analyzer"

changed to

"analyzer": null

If you need to be able to do exact match on the field and also support partial keyword searches then you need to index the field twice with different names. Maybe append “Exact” to the exact match field name and don’t use an analyzer for that one. The name without exact can have an analyzer. Then search on the field using the right field name index depending on the type of search.

Related