我正在使用带有两个match
项的布尔查询来查询索引。对于每个术语,我都有一套单独的前后标签。使用突出显示,我想获得两个词都存在的文档,并查看每个词都匹配的标记。索引包含使用morfologik分析的波兰语文档。我们将搜索的两个术语称为aspect
和feature
。我想查询索引并检索同时存在特定方面和功能的文档,并且我想让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>
答案 0 :(得分:0)
据我了解,如果您要对以空格分隔的字符串进行匹配查询,则应将标记生成器用作空白。
我建议您检查此令牌生成器。 https://www.elastic.co/guide/en/elasticsearch/reference/5.4/analysis-whitespace-tokenizer.html