【问题标题】:not able to search in compounding query using analyzer无法使用分析器在复合查询中进行搜索
【发布时间】:2019-09-22 16:21:52
【问题描述】:

我有一个问题索引,它有多个字段,例如标签(逗号分隔的标签字符串)、作者、测试者。我正在创建一个全局搜索,可以同时通过所有这些字段搜索问题。 我正在使用布尔查询 例如

{
    "query": {
        "bool": {
            "must": [{
                    "match": {
                        "author": "author_username"
                    }
                },
                {
                    "match": {
                        "tester": "tester_username"
                    }
                },
                {
                    "match": {
                        "tags": "<tag1,tag2>"
                    }
                }

            ]
        }
    }
}

没有分析器我能够得到结果,但它使用空格作为分隔符,例如 python 3 被搜索为 python 或 3。

但我想将 Python 3 作为单个查询进行搜索。因此,我为标签创建了一个分析器,以便每个逗号分隔的标签都被视为一个标签,而不是标准空格。

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": ","
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "tags": {
        "type": "text",
        "analyzer": "my_analyzer", 
        "search_analyzer": "standard" 
      }
    }
  }
}

但现在我没有得到任何结果。请让我知道我在这里缺少什么。我在文档中找不到复合查询中使用分析器:https://www.elastic.co/guide/en/elasticsearch/reference/current/compound-queries.html

添加示例:

{

   "query": {
        "bool": {
            "must": [{
                    "match": {
                        "author": "test1"
                    }
                },
                {
                    "match": {
                        "tester": "test2"
                    }
                },
                {
                    "match": {
                        "tags": "test3, abc 4"
                    }
                }

            ]
        }
    }
}

结果应该匹配所有字段,但是对于 tags 字段应该有一个标签的联合,并且查询应该用逗号分隔而不是空格。即查询应匹配 testabc 4 但高于搜索 test、abc 和 4 的查询。

【问题讨论】:

  • 添加样本数据。查询条件是什么?查询应该匹配所有字段还是任何一个字段?

标签: elasticsearch elasticsearch-analyzers


【解决方案1】:

您需要从映射中删除 search_analyzer 或在匹配查询中传递 my_analyzer

GET tags/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "tags": {
              "query": "python 3",
              "analyzer": "my_analyzer"  --> by default search analyzer is used
            }
          }
        }
      ]
    }
  }
}

默认情况下,查询将使用字段映射中定义的分析器,但可以使用 search_analyzer 设置覆盖。

【讨论】:

  • 已经尝试过了,但看起来分析器无法通过使用布尔查询的匹配查询传递 - 得到这个错误 [匹配] 查询不支持多个字段,找到 [标签] 和 [分析器]
  • 您可能正在像这样“必须”使用它:[ { "match": { "FIELD": "tags", "analyzer": "my_analyzer" } } ]。使用我的答案中的匹配查询格式
猜你喜欢
  • 2019-01-07
  • 2012-06-10
  • 2019-09-05
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多