elasticsearch 在搜索期间检索令牌有效负载

mwngjboj  于 7个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(83)

我有一个如下定义的索引,它使用delimited payload token filter并存储有效负载沿着令牌:

PUT text_payloads
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "term_vector": "with_positions_payloads",
        "analyzer": "payload_delimiter"
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "payload_delimiter": {
          "tokenizer": "whitespace",
          "filter": [ "delimited_payload" ]
        }
      }
    }
  }
}

字符串
索引中的文档如下所示:

POST text_payloads/_doc/1
{
  "text": "the|0 brown|3 fox|4 is|0 quick|10"
}


我可以使用_termvectors API获取有效负载:

GET text_payloads/_termvectors/1
{
  "fields": [ "text" ],
  "payloads": true
}


这将返回以下结果:

{
  "_index": "text_payloads",
  "_id": "1",
  "_version": 1,
  "found": true,
  "took": 0,
  "term_vectors": {
    "text": {
      "field_statistics": {
        "sum_doc_freq": 5,
        "doc_count": 1,
        "sum_ttf": 5
      },
      "terms": {
        "brown": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 1,
              "payload": "QEAAAA=="
            }
          ]
        },
        "fox": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 2,
              "payload": "QIAAAA=="
            }
          ]
        },
        "is": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 3,
              "payload": "AAAAAA=="
            }
          ]
        },
        "quick": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 4,
              "payload": "QSAAAA=="
            }
          ]
        },
        "the": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 0,
              "payload": "AAAAAA=="
            }
          ]
        }
      }
    }
  }
}


如果我使用_search端点,使用match_phrase查询和荧光笔:

POST text_payloads/_search
{
  "query": {
    "match_phrase": {
      "text": "brown fox"
    }
  },
  "highlight": {
    "pre_tags": ["<mark>"],
    "post_tags": ["</mark>"],
    "encoder": "html",
    "fields": {
      "text": {}
    }
  }
}


我得到以下结果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "text_payloads",
        "_id": "1",
        "_score": 0.5753642,
        "_source": {
          "text": "the|0 brown|3 fox|4 is|0 quick|10"
        },
        "highlight": {
          "text": [
            "the|0 <mark>brown|3</mark> <mark>fox|4</mark> is|0 quick|10"
          ]
        }
      }
    ]
  }
}


这是可行的,我可以从突出显示的搜索结果中解析出有效载荷,但我宁愿ElasticSearch给予某种结构化格式的有效载荷。如果ElasticSearch然后突出显示结果,不包括结果中的有效载荷,而只是给我纯文本,那就更好了。
ElasticSearch可以做到这一点吗?或者我应该坚持解析嵌入有效负载的结果?

sf6xfgos

sf6xfgos1#

但我更希望ElasticSearch给予我某种结构化格式的有效载荷。
术语向量和多术语向量API是这里要走的路。
ElasticSearch可以做到这一点吗?
目前还没有,除非你想把它作为一个插件来实现。
或者我应该坚持解析嵌入有效负载的结果?
我认为这是最简单的处理方法。没有太多支持插件之外的有效负载处理。Highlighter也不知道有效负载分隔格式,所以对于Highlighter brown|3只是输入文本的一部分,索引为brown,荧光笔会根据存储的位置或其他分析找到brown并突出显示相应的文本。这意味着它将突出显示brown|3.如果你不想删除payloads,你需要索引这个字段两次-有和没有payload,并突出显示没有payload的版本。
使用highlighter发现的信息来找到术语向量的对应部分也很棘手。内部highlighter确切地知道原始标记的位置,但它不会将此信息给予客户端,而只是将此信息应用于原始字符串的结果。用户要求启用almost a decade old issue

相关问题