假设我有字段名称“id”、“nm”、“limit”、“description”、“la”
所有字段均为多字段,其中主字段为TEXT,KEYWORD后缀为“ke”。小写规范化器是在 KEYWORD 字段类型上实现的。
现在的要求是,我必须提供“nm”上的搜索功能。如果用户搜索文本字符串,则字符串中的确切单词应优先并首先显示。结果集还应该包含单词的数据,其中搜索字符串中的任何单词都可用,即使是部分单词。 例子 : 数据集:
示例1: 搜索字符串:哇!我是 预期结果:
说明:1. 将优先,因为它具有精确的搜索字符串“哇!我是” 2. 它将排在第二位,因为它有部分精确的字符串“I am” 3. 优先级最低,但在结果集中,因为部分单词功能,因为它具有来自搜索字符串的“i”。
示例2: 搜索字符串:你是吗 预期结果:
说明:
我需要弹性查询来满足这个需求。
我尝试过使用 boost 的 function_score ,但它不适用于特殊字符。我将精确单词搜索与通配符结合起来,有时有效,有时无效
尝试这个查询。这应该可以解决您的问题
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"match_phrase": {
"nm.ke": {
"query": "wow! I am",
"boost": 5 // Highest priority for exact phrase
}
}
},
{
"match_phrase": {
"nm": {
"query": "wow! I am",
"boost": 3 // Boost for exact partial phrase match in text
}
}
},
{
"multi_match": {
"query": "wow! I am",
"fields": ["nm^2", "nm.ke^4"], // Prioritize keyword field
"type": "phrase_prefix", // Match partial phrases
"boost": 2 // Lower boost for prefix matches
}
},
{
"multi_match": {
"query": "wow! I am",
"fields": ["nm^1.5", "nm.ke^3"], // Match individual words in text/keyword
"type": "best_fields", // Default type for word match
"fuzziness": "AUTO", // Allow for typos in search terms
"boost": 1 // Lowest priority for partial words
}
}
]
}
},
"score_mode": "sum" // Combine all scores
}
}
}