我有一个Azure搜索索引,其中的一个字段(艺术家)可以在同一行中包含多个结果,因此我使用分隔符将它们分开。如何获得搜索索引以将字符识别为搜索的一部分?
基本上我想做的是找到任何与我的搜索字词相同,包含或完全匹配的艺术家的条目。
我的分隔符:
public const char Separator = '§';
包含:
string searchText = $" Artists: \"Jim\" ";
开头为:
string searchText = $" Artists: \"{sep}Jim\" ";
完全匹配:
string searchText = $" Artists: \"{sep}Jim{sep}\" ";
我有一个简单的索引定义:
internal class IndexDefinition
{
public static Index TestIndex = new Index()
{
Name = "test-index",
Fields = new[]
{
new Field("ID", DataType.String)
{
IsKey = true,
IsSearchable = false,
IsFilterable = false,
IsSortable = false,
IsRetrievable = true
},
new Field("Artists", DataType.String)
{
IsKey = false,
IsSearchable = true,
IsFilterable = true,
IsSortable = true,
IsRetrievable = true
},
}
};
}
我的样本数据如下:
internal class Data
{
public static List<TestSearchResultModel> Create()
{
var sep = Consts.Separator;
return new List<TestSearchResultModel>()
{
new TestSearchResultModel(){ ID="1", Artists=$"{sep}Jim{sep}" },
new TestSearchResultModel(){ ID="2", Artists=$"{sep}Harry Jim{sep}" },
new TestSearchResultModel(){ ID="3", Artists=$"{sep}John Jones{sep}Fred Durst{sep}" },
new TestSearchResultModel(){ ID="4", Artists=$"{sep}John Jones{sep}Fred Durst{sep}Mike Wallace{sep}" },
new TestSearchResultModel(){ ID="5", Artists=$"{sep}Fred Jones{sep}James Durst{sep}" },
new TestSearchResultModel(){ ID="6", Artists=$"{sep}Fred Jones{sep}Jim{sep}" },
new TestSearchResultModel(){ ID="7", Artists=$"{sep}Fred Jones{sep}Jim Johnson{sep}" },
};
}
}
我使用以下搜索参数:
var searchParameters = new SearchParameters()
{
SearchMode = SearchMode.All,
QueryType = QueryType.Full,
IncludeTotalResultCount = true,
Top = 10_000
};
然后执行这样的搜索:
var searchResults = await indexClient.Documents.SearchAsync<TestSearchResultModel>(searchText: searchText, searchParameters: searchParameters);
搜索似乎忽略了我的分隔符。例如,对\"{sep}Jim\"
的搜索将返回$"{sep}Harry Jim{sep}"
,但不应返回。
如果我使用诸如
之类的字符串,它的行为正确public const string Separator = " a ";
,但我需要使用不太可能出现在演出者姓名中的单个字符来使其正常工作。
有什么办法可以实现?谢谢。