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