首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用edge_ngram过滤器时如何突出显示部分单词

使用edge_ngram过滤器时如何突出显示部分单词
EN

Stack Overflow用户
提问于 2021-01-21 14:07:09
回答 1查看 100关注 0票数 2

我在我的分析器中使用了edge_ngram过滤器,例如我索引了一个单词"EVA京",它将被映射到一个数组E,EV,EVA,京。然后我搜索"EV",原因是"EVA京“可以被召回。但是高亮显示是错误的!高亮显示的结果是"EVA京",而不是"EVA京“。

有人能给我一个提示如何纠正高亮结果吗?

我的索引设置和映射:

代码语言:javascript
复制
PUT my-index-001
{
  "settings": {
    "analysis": {
      "filter": {
        "edge_ngram_1_100": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 100
        }
      },
      
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase", "edge_ngram_1_100"]
        }
      }
    }
  }, 
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer",
        "search_analyzer": "standard"
      }
    }
  }
}

然后添加一句话:

代码语言:javascript
复制
PUT my-index-001/_doc/1
{
  "name": "EVA新世纪福音战士"
}

然后我会搜索:

代码语言:javascript
复制
GET my-index-001/_search
{
  "query": {
    "match": {
      "name": {
        "query": "EV"
        , "operator": "and"
      }
    }
  }
  , "highlight": {
    "fields": {
      "name": {
      }
    }
  }
}

搜索结果为:

代码语言:javascript
复制
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.3133171,
    "hits" : [
      {
        "_index" : "my-index-001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.3133171,
        "_source" : {
          "name" : "EVA新世纪福音战士"
        },
        "highlight" : {
          "name" : [
            "<em>EVA</em>新世纪福音战士"
          ]
        }
      }
    ]
  }
}
EN

回答 1

Stack Overflow用户

发布于 2021-01-21 14:12:52

如果您需要对文档的部分单词匹配结果进行highlight,则可以通过以下方式来实现:

添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例

索引映射:

代码语言:javascript
复制
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 20,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    },
    "max_ngram_diff": 50
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

索引数据:

代码语言:javascript
复制
{
    "name":"EVA新世纪福音战士"
}

搜索查询:

代码语言:javascript
复制
{
  "query": {
    "match": {
      "name": {
        "query": "EV"
      }
    }
  },
  "highlight": {
    "fields": {
      "*": {
        "type": "plain",
        "fragment_size": 20,
        "pre_tags": "<span class='bold'>",
        "post_tags": "</span>",
        "number_of_fragments": 1
      }
    }
  }
}

搜索结果:

代码语言:javascript
复制
"hits": [
  {
    "_index": "65821975",
    "_type": "_doc",
    "_id": "1",
    "_score": 0.5753642,
    "_source": {
      "name": "EVA新世纪福音战士"
    },
    "highlight": {
      "name": [
        "<span class='bold'>EV</span>A新世纪福音战士"
      ]
    }
  }
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65821975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档