【发布时间】:2022-01-28 20:26:08
【问题描述】:
主要问题
用户正在寻找一个名称并输入它的一部分,比如说au,然后找到带有文本paul 的文档。
我想让文档像p<em>au</em>l一样突出显示。
如果我有一个复杂的搜索查询(匹配、前缀、通配符与规则相关性的组合),我该如何实现?
子问题
documentation 的 type、boundary_scanner 和 boundary_chars 的突出显示设置何时起作用?根据我下面描述的测试,这些设置不会更改突出显示的部分。
尝试 1:使用默认分析器进行通配符查询
PUT myindex
{
"mappings": {
"properties": {
"name": {
"type": "text",
"term_vector": "with_positions_offsets"
}
}
}
}
POST myindex/_doc/1
{
"name": "paul"
}
GET myindex/_search
{
"query": {
"wildcard": {"name": "*au*"}
},
"highlight": {
"fields": {
"name": {}
},
"type": "fvh",
"boundary_scanner": "chars",
"boundary_chars": "abcdefghijklmnopqrstuvwxyz.,!? \t\n"
}
}
这种搜索返回高亮<em>paul</em>,但我需要得到p<em>au</em>l。
尝试 2:使用 NGRAM 分析器匹配查询
这个工作如 SO 问题中所述:Highlighting part of word in elasticsearch
PUT myindexngram
{
"settings": {
"analysis": {
"tokenizer": {
"ngram_tokenizer": {
"type": "nGram",
"min_gram": "2",
"max_gram": "3",
"token_chars": [
"letter",
"digit"
]
}
},
"analyzer": {
"index_ngram_analyzer": {
"type": "custom",
"tokenizer": "ngram_tokenizer",
"filter": [
"lowercase"
]
},
"search_term_analyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": "lowercase"
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "index_ngram_analyzer",
"term_vector": "with_positions_offsets"
}
}
}
}
POST myindexngram/_doc/1
{
"name": "paul"
}
GET myindexngram/_search
{
"query": {
"match": {"name": "au"}
},
"highlight": {
"fields": {
"name": {}
}
}
}
这会根据需要突出显示p<em>au</em>l,但是:
- 突出显示取决于查询类型,因此结合
match和wildcard将再次生成<em>paul</em>。 -
type、boundary_scanner和boundary_chars设置上的突出显示完全不受影响。
弹性版本 7.13.4
【问题讨论】: