鉴于以下文件,
{
"domain": "www.example.com",
"tag": [
{
"name": "IIS"
},
{
"name": "Microsoft ASP.NET"
}
]
}
当我为asp
或asp.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
有什么想法吗?
答案 0 :(得分:1)
首先,query_string
查询不支持嵌套查询,除非使用include_in_parent: true
(这将使nested
字段变为平坦在映射中,父文档中的数组,query_string将无法正常工作。
其次,使用您的分析器,您将在{Elasticsearch中将asp.net
作为索引的术语。这意味着query_string
将与tag.name:asp.net
和tag.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"