我想定义一个模式,该模式可以解决相同搜索值的部分搜索和精确搜索。
精确搜索应始终返回“完全匹配”,在这种情况下,ES不应将搜索字符串分成标记。
答案 0 :(得分:0)
对于部分匹配,属性的数据类型应为text
,对于精确匹配,属性的类型应为keyword
。为了可以部分搜索和精确搜索,而不必将数据索引到不同的属性,可以使用fields
。它的作用是帮助将相同的数据以不同的方式编制索引。
因此,假设您要索引人员的姓名,并具有部分和精确搜索的能力。在这种情况下,映射将为:
PUT test
{
"mappings": {
"_doc": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
让一些文档编入索引:
PUT test/_doc/1
{
"name": "Nishant Saini"
}
PUT test/_doc/2
{
"name": "Nishant Kumar"
}
对于部分搜索,我们必须查询name
字段,其类型为text
。
GET test/_doc/_search
{
"query": {
"query_string": {
"query": "Nishant Saini",
"field": [
"name"
]
}
}
}
上面的查询将返回两个文档(1和2),因为两个令牌中的字段Nishant
都出现了一个标记,即name
。
要进行精确搜索,我们需要在name.keyword
上进行查询。要执行完全匹配,我们可以使用以下术语查询:
{
"query": {
"term": {
"name.keyword": "Nishant Saini"
}
}
}
这将仅匹配doc 1。