【发布时间】:2019-07-04 20:33:07
【问题描述】:
我有一个包含 4 个自定义分析器的搜索索引。其中两个用于特定语言的搜索,另外两个用于“精确”搜索(不需要词形还原)。为简单起见,我只包含特定语言自定义分析器的信息,尽管整体解决方案需要适用于所有自定义分析器。
{
"tokenizers": [
{
"@odata.type": "#Microsoft.Azure.Search.MicrosoftLanguageStemmingTokenizer",
"name": "text_language_search_custom_analyzer_ms_tokenizer",
"maxTokenLength": 300,
"isSearchTokenizer": false,
"language": "french"
},
{
"@odata.type": "#Microsoft.Azure.Search.MicrosoftLanguageStemmingTokenizer",
"name": "text_language_search_endsWith_custom_analyzer_ms_tokenizer",
"maxTokenLength": 300,
"isSearchTokenizer": false,
"language": "french"
}
],
"analyzers": [
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "text_language_search_custom_analyzer",
"tokenizer": "text_language_search_custom_analyzer_ms_tokenizer",
"tokenFilters": [
"lowercase",
"lang_text_synonym_token_filter",
"asciifolding"
],
"charFilters": [
"html_strip"
]
},
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "text_language_search_endsWith_custom_analyzer",
"tokenizer": "text_language_search_endsWith_custom_analyzer_ms_tokenizer",
"tokenFilters": [
"lowercase",
"lang_text_endsWith_synonym_token_filter",
"asciifolding",
"reverse"
],
"charFilters": [
"html_strip"
]
}
]
}
为简单起见,我们假设索引只有 2 个可搜索字段。 - CategoryLangSearch(使用 text_language_search_custom_analyzer) - CategoryLangSearchEndsWith(使用 text_language_search_endsWith_custom_analyzer)
现在假设索引只有 1 个文档,包含以下内容: - "TELECOMMUNICATIONS" 的 CategoryLangSearch 字段值 - CategoryLangSearchEndsWith 字段值为“TELECOMMUNICATIONS”
我们的 UI/API 层具有逻辑,因此如果用户搜索 TELE*,它现在将使用 CategoryLangSearch 作为搜索字段。同样,我们的 UI/API 层将检测用户是否使用星号通配符进行搜索正面。因此,如果用户搜索 *TIONS,UI/API 层足够智能,可以改为搜索 CategoryLangSearchEndsWith 字段。
这一切都很棒......它完全按照预期工作。
然而,问题是,如果用户使用 * COMMU * 进行搜索,我们该怎么办? (忽略空格... S.O. 将星号视为粗体信号。用户键入 asteriskCOMMUasterisk,其中星号为 *)
我认为如果我像这样构建 azure 搜索参数会很“聪明”: (CategoryLangSearch:(COMMU*) OR CategoryLangSearchEndsWith:(*UMMOC)) 但在实践中,我发现这找不到 TELECOMMUNICATIONS ORGANIZATION .当我看到我们构建的查询时,这非常有意义。
所以,我的问题是,我们如何解决这个问题?无论如何,我们可以在 Azure 搜索中以形状或形式实现它吗?我看不到这条成功之路。我能看到的唯一可能的解决方案如下: 1. 如果用户搜索 something... 2.首先直接查询我们的MS SQL服务器,使用SQL支持的%something%语法进行搜索。 3. 找到匹配的 ID,然后使用 THAT 搜索 Azure 搜索索引。
【问题讨论】:
-
嘿 Andres,旁注,因为您定义的两个标记器具有完全相同的配置,因此您定义一个并在您的两个客户分析器中使用它就足够了。这将使您的索引定义更清晰,但对行为的服务性能没有影响。
-
谢谢@Yahnoosh... 甚至没有注意到这一点,但这是有道理的 :) 我只想让事情变得更简单。