我有以下情况:
简单分析器处理文本“棕色和绿色狐狸是快速的”,并添加个别小写术语的索引。
我想对我的索引使用以下查询短语:“快速布朗f”
我使用前缀来运行这个搜索:
{
"query": {
"match_phrase_prefix" : {
"message" : {
"query" : "quick brown f",
"max_expansions" : 10
}
}
}
}不幸的是,没有返回结果,因为术语的顺序与查询项不匹配。如果我使用匹配查询和使用完整的术语,我将得到结果。似乎match_phrase_prefix正在检查订单:
这个查询的工作方式是用快速和棕色创建短语查询(即,术语must必须存在,并且必须是,后面是,后面是brown)。
我的问题是:
是否有一种方法可以运行一个查询,它处理不完整的术语并返回结果,而不管源文档中术语的顺序如何?我目前唯一能想到的选择是为输入查询中的每个术语手动创建一个查询(例如:快速、褐色、f),并使用bool查询将它们组合起来。
发布于 2017-11-20 21:42:39
edge_ngram分析器应该做您想做的事情。如果将其设置为min_gram值为1,最大克值设置为10,则文档将存储必要的令牌。然后,可以将标准分析器应用于查询文本,并将其与edge_ngram文档字段匹配。
示例在文件中与所请求的解决方案几乎完全相同。注意,在查询中使用显式and运算符,以确保所有搜索标记(部分或其他)都匹配。
从5.6的文件中:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"tokenizer": "autocomplete",
"filter": [
"lowercase"
]
},
"autocomplete_search": {
"tokenizer": "lowercase"
}
},
"tokenizer": {
"autocomplete": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 10,
"token_chars": [
"letter"
]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "autocomplete_search"
}
}
}
}
}
PUT my_index/doc/1
{
"title": "Quick Foxes"
}
POST my_index/_refresh
GET my_index/_search
{
"query": {
"match": {
"title": {
"query": "Quick Fo",
"operator": "and"
}
}
}
}https://stackoverflow.com/questions/47399956
复制相似问题