我正在将查询发送到Elastic Search以查找具有与查询匹配的字段的所有段。
我们正在实现“免费搜索”功能,用户可以编写自己想要的任何文本,并且我们构建了一个查询,该搜索将该文本抛出所有细分字段。
每个(或多个)字段具有此文本的细分
例如:
我想获取所有名称为“tony lopez”的细分。
每个段具有“first_name”字段和“last_name”字段。
我们的服务建立的查询:
"multi_match" : {
"query": "tony lopez",
"type": "best_fields"
"fields": [],
"operator": "OR"
}
使用此查询的Elastic的结果是一个段,其中包括“first_name”字段“tony”和“last_name”字段“lopez”,但是当“first_name”字段为“joe”而“last_name”为“tony”时”。
在这种查询中,我只想接收名称为“tony(first_name)lopez(last_name)”的句段
我该如何解决该问题?
最佳答案
希望我不会太早得出结论,但是如果您只想将tony
和lopez
作为名字和姓氏,请使用以下命令:
GET my_index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"first": "tony"
}
},
{
"match": {
"last": "lopez"
}
}
]
}
}
}
但是,如果您索引的文档之一包含例如
tony s
作为名字,则上面的查询也将返回它。为什么?
firstname
是text
数据类型More Details
如果通过
kibana
运行此查询:POST my_index/_analyze
{
"field": "first",
"text": ["tony s"]
}
您将看到
tony s
被分析为两个标记tony
和s
。这就是为什么上面的查询在结果中返回
tony s
的原因,它匹配tony
。如果只想获得
tony
和lopez
完全匹配,则应使用以下查询:GET my_index/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"first.keyword": {
"value": "tony"
}
}
},
{
"term": {
"last.keyword": {
"value": "lopez"
}
}
}
]
}
}
}
Read about keyword datatype
更新
尝试此查询-与我的
tony s
示例不是完全相同的问题,如果您有名字为lopez
和名字为tony
的文档,它将找到它。GET my_index/_search
{
"query": {
"multi_match": {
"query": "tony lopez",
"fields": [],
"type": "cross_fields",
"operator":"AND",
"analyzer": "standard"
}
}
}
cross fields
希望能帮助到你