你犯的错误是在关键字字段上使用了查询术语,而这两者都没有经过分析,这意味着它们尝试在反向索引中找到完全相同的搜索字符串。
你应该做的是:定义一个
文本
字段,如果您没有定义映射,则无论如何都会有。我还假设您在查询中提到了
.keyword
,如果您没有定义映射,则会自动创建该字段。
现在,您可以使用下面的
匹配查询,它是经过分析的,并使用
标准分析器来将令牌拆分成空格,因此您的2个示例文档将生成
人类学
、
250
和
230
。
简单高效的查询可同时获取这两个文档。
{
"query": {
"match" : {
"name" : "Anthropology 230"
}
}
}
搜索结果
"hits": [
{
"_index": "matchterm",
"_type": "_doc",
"_id": "1",
"_score": 0.8754687,
"_source": {
"name": "Anthropology 230"
}
},
{
"_index": "matchterm",
"_type": "_doc",
"_id": "2",
"_score": 0.18232156,
"_source": {
"name": "Anthropology 250"
}
}
]
上面的查询之所以匹配了两个文档,是因为它创建了两个标记
anthropology
和
230
,并在两个文档中都匹配了
anthropology
。
您应该阅读有关
分析过程的内容,并可以尝试使用
分析API查看为任何文本生成的标记。
您的文本的分析API输出:
POST http://{{hostname}}:{{port}}/{{index-name}}/_analyze
{
"analyzer": "standard",
"text": "Anthropology 250"
}
{
"tokens": [
{
"token": "anthropology",
"start_offset": 0,
"end_offset": 12,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "250",
"start_offset": 13,
"end_offset": 16,
"type": "<NUM>",
"position": 1
}
]
}