Elasticsearch嵌套映射似乎不起作用

时间:2016-04-05 07:00:02

标签: elasticsearch

鉴于以下文件,

{
  "domain": "www.example.com",
  "tag": [
    {
      "name": "IIS"
    },
    {
      "name": "Microsoft ASP.NET"
    }
  ]
}

当我为aspasp.net启动查询时,我希望在结果集中看到Microsoft ASP.NET文档。

所以我需要一个小写分析器并从单词分隔符中删除.字符,所以我尝试了以下映射,

curl -XPUT http://localhost:9200/tag-test -d '{
    "settings": {
        "analysis": {
            "filter": {
                "domain_filter": {
                    "type": "word_delimiter",
                    "type_table": [". => ALPHANUM", ": => ALPHANUM"]
                }
            },
            "analyzer": {
                "domain_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": ["lowercase", "domain_filter"]
                }
            }
        }
    },
    "mappings": {
        "assets": {
            "properties": {
                "domain": {
                    "type": "string",
                    "analyzer": "domain_analyzer"
                },
                "tag": {
                    "type": "nested",
                    "properties": {
                        "name": {
                            "type": "string",
                            "analyzer": "domain_analyzer"
                        }
                    }
                }
            }
        }
    }
}'; echo

然后我尝试了以下查询,所有这些查询都会产生一个空结果

tag.name:asp
tag.name:asp.net
tag.name:*asp*

我正在使用查询字符串查询,

curl http://localhost:9200/tag-test/_search?q=tag.name:asp

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先,query_string查询不支持嵌套查询,除非使用include_in_parent: true(这将使nested字段变为平坦在映射中,父文档中的数组,query_string将无法正常工作。

其次,使用您的分析器,您将在{Elasticsearch中将asp.net作为索引的术语。这意味着query_string将与tag.name:asp.nettag.name:*asp*一起使用。我建议不要使用前导通配符

所以,最后你的测试应该是:

PUT /tag-test
{
  "settings": {
    "analysis": {
      "filter": {
        "domain_filter": {
          "type": "word_delimiter",
          "type_table": [
            ". => ALPHANUM",
            ": => ALPHANUM"
          ]
        }
      },
      "analyzer": {
        "domain_analyzer": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "domain_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "assets": {
      "properties": {
        "domain": {
          "type": "string",
          "analyzer": "domain_analyzer"
        },
        "tag": {
          "type": "nested",
          "include_in_parent": true,
          "properties": {
            "name": {
              "type": "string",
              "analyzer": "domain_analyzer"
            }
          }
        }
      }
    }
  }
}

"include_in_parent": true的映射中注意tag。 然后查询应该是:

  • curl -XGET "http://localhost:9200/tag-test/_search?q=tag.name:asp*"
  • curl -XGET "http://localhost:9200/tag-test/_search?q=tag.name:asp.net"