在ElasticSearch中,我们应该在查询字符串中使用default_field来表示nGram分析器

时间:2012-05-09 14:43:21

标签: elasticsearch

我已经通过此JSON创建了索引和映射

// 1st Mapping
    http://localhost:9200/hdm/entities/_mapping
    {
            "entities" : {
                "properties": {
                    "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
                    "description": { "type": "string", "analyzer": "nGram" }
                }
            }
        }
// 2nd Mapping
    http://localhost:9200/hdm/products/_mapping
    {
        "products": {
            "_parent": { "type": "entities" },
            "properties": {
                "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
                "code": { "type": "string", "analyzer": "snowball" },
                "segment": { "type": "string", "analyzer": "snowball" },
                "description": { "type": "string", "analyzer": "snowball" }
            }
        }
    }

现在我使用JSON索引了这个索引中的一些文档

    http://localhost:9200/hdm/entities/100
    {
        "name":"Entity 001",
        "description":"this is the company or an organization which provides the whole medicine, tablets injunction for the problem of human being those noting worth gaining was ever gained without effort

",
        "itype":"entities"
    }

    http://localhost:9200/hdm/products/101?parent=100
    {
        "name":"biorich",
        "description":"the tablet para is used to rectify the person from the all types of pain in the body, kingston , car, bat, ball, description of the products",
        "code":"COD19202",  
        "segment":"SEG1022",
        "itype":"products"
    }

搜索我使用此JSON

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "should": [
            {
              "has_child": {
                "type": "products",
                "query": {
                  "query_string": {
                    "query": "tab"
                  }
                }
              }
            },
            {
              "query_string": {
                "query": "tablet"
              }
            }
          ]
        }
      },
      "filter": {
        "or": [
          {
            "term": {
              "itype": "entities"
            }
          }
        ]
      }
    }
  }
}

我没有得到结果但是我改变了这样的查询字符串然后我得到了结果

      "query_string": {
        "default_field" : "description"
        "query": "tablet"
      }
如果我们在查询字符串中提到default_field来获取nGram分析器结果,请你确认一下吗?我的分析仪配置如下

index.analysis.analyzer.mynGram.type: custom
index.analysis.analyzer.mynGram.tokenizer: standard
index.analysis.analyzer.mynGram.filter: [lowercase, mynGramFilter]
index.analysis.filter.mynGramFilter.type: nGram
index.analysis.filter.mynGramFilter.min_gram: 1
index.analysis.filter.mynGramFilter.max_gram: 10

1 个答案:

答案 0 :(得分:2)

如果查询中未指定"default_field",则elasticsearch正在使用特殊_all字段来执行搜索。由于您没有更改默认分析器,也没有为映射中的_all字段指定分析器,因此使用standard分析器对_all字段进行搜索。