我在Elasticsearch中放了2个文件:
curl -XPUT "http://localhost:9200/vehicles/vehicle/1" -d'
{
"model": "Classe A"
}'
curl -XPUT "http://localhost:9200/vehicles/vehicle/2" -d'
{
"model": "Classe B"
}'
Run Code Online (Sandbox Code Playgroud)
为什么此查询返回2个文档:
curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
"query": {
"query_string": {
"query": "model:\"Classe A\""
}
}
}'
Run Code Online (Sandbox Code Playgroud)
而这一个,只有第二个文件:
curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
"query": {
"query_string": {
"query": "model:\"Classe B\""
}
}
}'
Run Code Online (Sandbox Code Playgroud)
我希望弹性搜索匹配我传递给查询参数的确切短语,使用空格,我该怎么做?
Aks*_*hay 18
您需要注意的是您正在使用的分析仪.如果您未指定一个Elasticsearch将使用标准分析器.对于大多数使用纯文本输入的情况而言,这是很好的,但对于您提到的用例不起作用.
标准分析器将做的是拆分字符串中的单词,然后将它们转换为小写.
如果要匹配整个字符串"Classe A"并将其与"Classe B"区分开来,则可以使用关键字分析器.这将整个字段保持为一个字符串.
然后,您可以使用匹配查询,该查询将返回您期望的结果.
创建映射:
PUT vehicles
{
"mappings": {
"vehicle": {
"properties": {
"model": {
"type": "string",
"analyzer": "keyword"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
执行查询:
POST vehicles/_search
{
"query": {
"match": {
"model": "Classe A"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果要使用query_string查询,则可以将运算符设置为AND
POST vehicles/vehicle/_search
{
"query": {
"query_string": {
"query": "Classe B",
"default_operator": "AND"
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 12
此外,您可以使用query_string并转义引号也将返回一个确切的短语:
POST _search
{
"query": {
"query_string": {
"query": "\"Classe A\""
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
使用匹配短语查询,如下所述
GET /company/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
Run Code Online (Sandbox Code Playgroud)
好像在最新版本的 ES 中你可以只使用 .keyword
POST vehicles/_search
{
"query": {
"term": {
"model.keyword": "Classe A"
}
}
}
Run Code Online (Sandbox Code Playgroud)
它将完全匹配字符串“Classe A”
由 ES 确定为文本的动态字段将有一个子字段“关键字”,对于这种情况非常有用: https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html
| 归档时间: |
|
| 查看次数: |
20337 次 |
| 最近记录: |