Elasticsearch:有没有办法从突出显示中排除同义词?

时间:2018-03-16 14:03:02

标签: elasticsearch

我试图从突出显示中排除同义词。我用同义词过滤器创建了当前分析器的副本。因此,对于每个字段,我现在都有一个分析器和一个search_analyzer。搜索分析器是新的分析器,具有所有相同的过滤器和同义词过滤器。

有什么想法吗?我正在使用elasticsearch 5.2

映射:

"mappings": {
    "doc": {
      "properties": {
        "body": {
          "type": "text",
          "analyzer": "custom_analyzer",
          "search_analyzer": "custom_analyzer_with_synonyms",
          "fields": {
            "plain": {
              "type": "text",
              "analyzer": "standard"
            }
          }
        }
    }
}

搜索查询:

{
  "query": {
    "match": {
      "body": "something"
    }
  },
  "highlight": {
    "pre_tags": "<strong>", 
    "post_tags": "<strong>", 
    "fields" : {
      "body.plain" : {
        "number_of_fragments": 1,
        "require_field_match": false
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我不确定问题背后的原因。我认为只是在一个非同义词分析的领域上突出显示就可以了。但根据评论,它仍然突出了同义词。我可以想到两个可能的原因:(我还没有看过荧光笔源代码)

  1. 可能是因为此链接中提到的多字同义词问题:https://www.elastic.co/guide/en/elasticsearch/guide/current/multi-word-synonyms.html现在可以修复,因为链接已经过时了。如果没有,可能会导致荧光笔看错位置偏移。

  2. 和/或者,也可能是因为未在查询中使用突出显示字段。突出显示器可能只是使用从搜索字段的分析器(包含同义词)发出的令牌,并在突出显示的字段中查找这些令牌。

  3. 如果是第一个问题,您可以尝试更改同义词以使用简单收缩。请参阅:https://www.elastic.co/guide/en/elasticsearch/guide/current/synonyms-expand-or-contract.html#synonyms-contraction但是,它对于不常见的单词的频率有其自身的问题,并且可能需要做很多工作。

    修复第二种情况是使用&#34; body.plain&#34;查询中的字段,但您不能这样做,因为它会影响您的分数。在这种情况下,在非同义词字段上指定不同的荧光笔查询(以便分数不受影响)就可以了。即使第一种情况也是问题,它也有效,因为我们没有在高亮字段中使用同义词。 所以你的查询应该是这样的:

    {
      "query": {
        "match": {
          "body": "something"
        }
      },
      "highlight": {
        "pre_tags": "<strong>", 
        "post_tags": "<strong>", 
        "fields" : {
          "body.plain" : {
            "number_of_fragments": 1,
            "highlight_query": {
              "match": {"body.plain": "something"}
            }
          }
        }
      }
    }
    

    请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-highlighting.html#_highlight_query