2016-04-05 29 views
1

考慮下面的文件,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 

任何我DEAS?

+0

你重新索引文件後,新設置上傳? – xeye

+0

你正在運行什麼類型的查詢。我的意思是'term','querystring','match' ??? – Richa

+0

@xeye每次索引被刪除並重新創建 – daisy

回答

1

所有query_string查詢的前沒有對嵌套查詢和支持除非您使用include_in_parent: true(將壓平的父文檔的陣列中的nested場)在您的映射,QUERY_STRING永遠不會工作。其次,使用你的分析器,你將有asp.net作爲在Elasticsearch中索引的術語。這意味着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": truetag的映射。 那麼查詢應該是:

  • 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"
+0

謝謝安德烈!它的工作原理是,我只使用'*'使查詢字符串像'tag.name:micro *'工作(用'micro'查找'Microsoft ASP.NET'不起作用),我應該用ngram來實現嗎? – daisy

+0

我的意思是**領先**通配符:-)(意思是'* net')。這非常昂貴。恩格拉姆是另一種方式,是的。您需要測試性能並查看哪種更適合您。 –