【问题标题】:Configure highlighted part in the elasticsearch在elasticsearch中配置高亮部分
【发布时间】:2022-01-28 20:26:08
【问题描述】:

主要问题
用户正在寻找一个名称并输入它的一部分,比如说au,然后找到带有文本paul 的文档。 我想让文档像p<em>au</em>l一样突出显示。
如果我有一个复杂的搜索查询(匹配、前缀、通配符与规则相关性的组合),我该如何实现?

子问题
documentationtypeboundary_scannerboundary_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,但是:

  1. 突出显示取决于查询类型,因此结合matchwildcard 将再次生成<em>paul</em>
  2. typeboundary_scannerboundary_chars 设置上的突出显示完全不受影响。

弹性版本 7.13.4

【问题讨论】:

    标签: elasticsearch highlight


    【解决方案1】:

    来自 Elasticsearch 团队的回应:

    荧光笔对术语起作用,因此只能突出显示完整的术语 - 无论您的索引中的术语是什么。在您的第二个示例中,au 可以突出显示,因为它是索引中的一个术语,而您的第一个示例并非如此。 还有一个选项可以定义您自己的 highlight_query,它可能与主要的 query 不同,但这可能会导致不可预知的亮点。

    https://discuss.elastic.co/t/configure-highlighted-part/295164

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 2017-03-07
      • 2012-06-18
      • 2012-11-23
      • 1970-01-01
      • 2015-12-05
      • 2018-03-17
      相关资源
      最近更新 更多