👶

AI SearchでComplexTypeのサブフィールドを検索する

2024/05/16に公開

やりたいこと

searchFieldsComplexTypeのサブフィールドを指定して検索したい。

searchFieldsとは

searchFieldsは、AI Seachの検索クエリのパラメータ。
フルテキスト検索でどのフィールドに対して検索をかけるか指定できる。

The comma-separated list of field names to which to scope the full-text search. When using fielded search (fieldName:searchExpression) in a full Lucene query, the field names of each fielded search expression take precedence over any field names listed in this parameter.

https://learn.microsoft.com/en-us/rest/api/searchservice/documents/search-post?view=rest-searchservice-2023-11-01&tabs=HTTP

前提条件

検索対象のインデックスの定義は以下の通り。
aaaEdm.ComplexType で、中に bbb ccc ddd というサブフィールドがあり、型はいずれも EDM.String となっている。

{
  "name": "hoge",
  "fields": [
    { "name": "id", "type": "Edm.String", "key": true, "filterable": true },
    { "name": "url", "type": "Edm.String", "searchable": true, "filterable": false },
    { "name": "filepath", "type": "Edm.String", "searchable": true, "filterable": false},
    { "name": "aaa", "type": "Edm.ComplexType",
      "fields": [
        { "name": "bbb", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "searchable": true },
        { "name": "ccc", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "searchable": true },
        { "name": "ddd", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "searchable": true }
      ]
    }
  ]
}

結論

"searchFields":"{ComplexTypeの項目名}/{サブフィールドの項目名}" と書く。

Luceneの構文でも同様。
"search":"{ComplexTypeの項目名}/{サブフィールドの項目名}:{検索ワード}"

やったこと

aaaのサブフィールドbbbが"XXX"なものを検索しようとして以下のクエリを投げたら

{
  "search": "XXX",
  "queryType": "full",
  "searchFields": "bbb"
}

bbbというフィールドはない、とエラーが出た。

"Unknown field 'bbb' in search field list.\r\nParameter name: searchFields"

aaa.bbb aaa["bbb"] に変えて試したが同様のエラー。

調べたら、以下のドキュメントにサブフィールドを指定して検索する方法が書いてあった。
フィールドとサブフィールドを / で区切ればいいそう。

{
  "search": "XXX",
  "queryType": "full",
  "searchFields": "aaa/bbb"
}

https://learn.microsoft.com/ja-jp/azure/search/search-howto-complex-data-types?tabs=complex-type-rest#search-complex-fields

以上、少しつまずいたので共有でした。

ヘッドウォータース

Discussion