我有一个Elasticsearch仓库和一个应用程序,可以为我们称之为“资产”的文档创建文档。我需要阻止用户创建资产'使用相同的标题'。
当用户尝试创建'资产'我正在查询带有标题的回购,如果匹配则会向用户显示错误消息。
我的问题是,当我查询标题时,我会得到多个结果(类似的匹配)。
这是我目前的查询:
GET assets-1/asset/_search
{
"query": {
"match": {
"title": {
"query": "test",
"operator": "and"
}
}
}
}
我有许多标题记录:'测试1','测试2','测试bla'并且只有一个标题为' test'。
但我得到了以上所有内容。
我是否需要在查询中添加任何条件或属性,以便与术语完全匹配?
答案 0 :(得分:0)
您的标题字段可能已经过分析,因此test
标记将匹配包含该标记的任何标题。
要实现完全匹配,您需要拥有not_analyzed
字段并对其进行term
查询。
您需要将title
字段的映射更改为:
curl -XPUT localhost:9200/assets-1/_mapping/asset -d '{
"asset": {
"properties": {
"title": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}'
然后您需要重新索引数据,然后您就可以运行完全匹配的查询:
curl -XPOST localhost:9200/assets-1/asset/_search -d '{
"query": {
"term": {
"title.raw": "test"
}
}
}'