Elasticsearch:FVH高亮显示带有多个错误标记令牌的前后标签吗?

时间:2019-04-08 10:11:36

标签: elasticsearch

我正在使用带有两个match项的布尔查询来查询索引。对于每个术语,我都有一套单独的前后标签。使用突出显示,我想获得两个词都存在的文档,并查看每个词都匹配的标记。索引包含使用morfologik分析的波兰语文档。我们将搜索的两个术语称为aspectfeature。我想查询索引并检索同时存在特定方面和功能的文档,并且我想让highlight功能用<aspect>标签标记方面令牌,并用<feature>标记功能标签。尽管在大多数情况下,Elasticsearch有时会按预期运行,但标记中的一个或两个标记均不正确。我举一个例子。

因此,假设我的索引包含以下文档:

"Najlepsza maseczka na zniszczone włosy!"

如果我搜索“ maseczka”(方面)和“ dobry”(功能),我期望输出如下:

"<feature>Najlepsza</feature> <aspect>maseczka</aspect> na zniszczone włosy! "

出于某种原因,Elasticsearch的结果如下:

"<aspect>Najlepsza</aspect> <aspect>maseczka</aspect> na zniszczone włosy! "

到目前为止我所知道的:

  • 我认为在进行分析时,外观和特征可能具有相似的形式,但事实并非如此,例如上述示例返回的_analyze
#query
GET my_index/_analyze
{
  "analyzer": "morfologik",
  "text": "dobra maseczka"
}

#results
{
  "tokens": [
    {
      "token": "dobra",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "dobro",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "dobry",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "maseczka",
      "start_offset": 6,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}
# Analysis of the document:
get my_index/_analyze
{
  "analyzer": "morfologik",
  "text": "Najlepsza maseczka na zniszczone włosy"
}
# response
{
  "tokens": [
    {
      "token": "dobry",
      "start_offset": 0,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "maseczka",
      "start_offset": 10,
      "end_offset": 18,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "na",
      "start_offset": 19,
      "end_offset": 21,
      "type": "<ALPHANUM>",
      "position": 2
    },
    ...
  ]
}
  • 这也不是特定方面或功能的问题,因为对于某些查询,索引将同时返回正确和错误突出显示的文档(因此,我希望这是文档而不是查询的问题)< / p>

  • 在某些情况下,两个术语都被突出显示为方面,在某些方面被标记为特征,而特征被标记为方面,到目前为止我还没有找到任何规则

  • 我认为,如果我的搜索字词与Highlights标签的顺序匹配,则第一个字词应始终获得第一个标签,第二个字词应始终获得第二个标签,但是也许它们以不同的方式起作用?我认为这是受this response启发的方式:

      

    使用快速矢量荧光笔,您可以按“重要性”的顺序指定标签,这似乎意味着它们的顺序与搜索字词的顺序应匹配。

这是我的索引的构造方式:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "morfologik": {
          "tokenizer": "standard",
          "filter": [
            "morfologik_stem",
            "lowercase"
          ],
          "type": "custom"
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "content": {
          "type": "text",
          "term_vector": "with_positions_offsets",
          "analyzer": "morfologik"
        },
        "original_doc": {
          "type": "integer"
        }
      }
    }
  }
}

这是我的查询:

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match" : { "content" : "maseczki" } }, 
        { "match" : { "content" : "dobre" } }
      ]
  }},
  "highlight": {
    "fields": {
      "content": {
        "fragment_size": 200,
        "type": "fvh",
        "pre_tags": ["<aspect>", "<feature>"],
        "post_tags": ["</aspect>", "</feature>"]
      }
    }
  }
}

这是示例响应:

{
        "_index": "my_index",
        "_type": "doc",
        "_id": "R91v7GkB0hUBqPARgC54",
        "_score": 16.864662,
        "_source": {
          "content": "Najlepsza maseczka na zniszczone włosy! ",
          "original_doc_id": 74290
        },
        "highlight": {
          "content": [
            "<aspect>Najlepsza</aspect> <aspect>maseczka</aspect> na zniszczone włosy! "
          ]
        }
      },

正如我所说,大多数情况下查询工作正常,有时全方面突出显示仅针对特定查询结果的子集,就像“(opakowanie,solidne)”的情况一样:

  • 这里的方面实际上是特征,而特征是方面
<aspect>solidne</aspect>, naprawdę świetne <feature>opakowanie</feature>
  • solidne应该在此处标记为功能
Jedyne do czego mogłabym się przyczepić to <aspect>opakowanie</aspect> które wg mnie niestety nie jest <aspect>solidne</aspect>

1 个答案:

答案 0 :(得分:0)

据我了解,如果您要对以空格分隔的字符串进行匹配查询,则应将标记生成器用作空白

我建议您检查此令牌生成器。 https://www.elastic.co/guide/en/elasticsearch/reference/5.4/analysis-whitespace-tokenizer.html