无法使用分析器搜索复合查询

时间:2019-09-21 18:52:24

标签: elasticsearch elasticsearch-analyzers

我有一个问题索引,其中包含多个字段,例如标签(标签的逗号分隔字符串),作者,测试人员。我正在创建一个全局搜索,可以在所有这些字段中一次搜索问题。 我正在使用布尔查询 例如

{
    "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"
                    }
                }

            ]
        }
    }
}

结果应与所有字段匹配,但对于标签字段,应包含标签的并集,并且查询应以逗号分隔,不能以空格分隔。即查询应匹配 test abc 4 ,但在上面的查询中搜索test,abc和4。

1 个答案:

答案 0 :(得分:2)

您需要从映射中删除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设置将其覆盖。