ES中有多个字段的通配符查询?

时间:2015-11-19 22:47:51

标签: elasticsearch

任何人都可以告诉我如何在elasticsearch中编写带有多个字段的通配符查询我已经搜索了很多但是有些人告诉我使用查询字符串或多重匹配但是在我的情况下问题是查询字符串不起作用对我来说,我的代码在下面给出了一个字段通配符查询,如果有人知道这个,请分享一下这个

"query": {
      "wildcard" : { "places_area1.city.raw_wildcard" : last_wildcard_string }
 }

更新 映射

"settings": {
        "index": {
          "analysis": {
            "analyzer": {
              "synonym_wildcard": {
                "tokenizer": "whitespace",
                "filter": ["filter_wildcard"]
              },
              "synonym_term": {
                "tokenizer": "keyword",
                "filter": ["filter_term"]
              },
              "simple_wildcard": {
                "tokenizer": "whitespace"
              }
            },
            "filter": {
              "filter_term": {
                "tokenizer": "keyword", // here you have to write this only for tokenizer keyword but not for whitespace
                "type": "synonym",
                "synonyms_path": "synonyms.txt",
              },
              "filter_wildcard": {
                "type": "synonym",
                "synonyms_path": "synonyms.txt",
              }
            }
          }
        }
      },
      mappings : {
        places_area1: {
          properties:{
            area1         : {"type" : "string", "index": "analyzed", "analyzer": "simple_wildcard"},
            city         : {"type" : "string", "fields": {
              "raw": {
                "type": "string",
                "analyzer": "synonym_term"
              },
              "raw_wildcard": {
                "type": "string",
                "analyzer": "synonym_wildcard"
              }
            } },
          }
        }
      }
    }

先谢谢你

1 个答案:

答案 0 :(得分:5)

你在找这样的东西吗?

{
  "query": {
    "query_string": {
      "fields": ["title", "description", "state"], 
      "query": "Ban*",
      "lowercase_expanded_terms": false
    }
  }
}

为什么您需要"lowercase_expanded_terms": false

由于您使用的是keywordwhitespace令牌系统,因此班加罗尔这个词会被编入班加罗尔并使用query string wildcard {{ 1}}是小写的,因为它是默认设置,ES正在查找以 ban 开头的单词,因此它找不到班加罗尔。您也可以通过向Ban*

添加lowercase过滤器来解决此问题

此前它之前有效,因为您没有指定任何分析员,默认情况下ES使用mappings并且内部使用standard analzyer