2016-09-23 37 views
0

我想创建一个分析器,它用一个空格替换特殊字符并将其转换为大写。然后,如果我想用小写搜索它也应该工作。elasticsearch映射分析器 - 获取不到结果

映射分析:

[email protected]:~/Downloads/elasticsearch-2.4.0/bin$ curl -XPUT 'http://localhost:9200/aida' -d '{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my_analyzer": { 
      "tokenizer": "standard", 
      "char_filter": [ 
      "my_char_filter" 
      ], 
      "filter": [ 
      "uppercase" 
      ] 
     } 
     }, 
     "char_filter": { 
     "my_char_filter": { 
      "type": "pattern_replace", 
      "pattern": "(\\d+)-(?=\\d)", 
      "replacement": "$1 " 
     } 
     } 
    } 
    } 
} 
' 
{"acknowledged":true} 


[email protected]:~/Downloads/elasticsearch-2.4.0/bin$ curl -XPOST 'http://localhost:9200/aida/_analyze?pretty' -d '{ 
"analyzer":"my_analyzer", 
"text":"My name is Soun*arya?jwnne&yuuk" 
}' 

它是通过用空白字符替换特殊字符标记化正确的话。现在,如果我从文本中搜索一个单词,它不会检索到任何结果。

[email protected]:~/Downloads/elasticsearch-2.4.0/bin$ curl -XGET 'http://localhost:9200/aida/_search' -d '{ 
"query":{ 
"match":{ 
"text":"My" 
} 
} 
}' 

我没有从上面的GET查询中得到任何结果。得到如下结果:

[email protected]:~/Downloads/elasticsearch-2.4.0/bin$ curl -XGET 'http://localhost:9200/aida/_search' -d '{ 
"query":{ 
"match":{ 
"text":"my" 
} 
} 
}' 
{"took":5,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}} 

任何人都可以帮助我解决这个问题!谢谢!

+0

愚蠢的问题,但你有创建索引后索引任何数据?对“_analyze”的调用不会对任何内容编制索引,只是简单地向您显示如何分析文本。我认为这是在你的[其他问题]相同的问题(http://stackoverflow.com/questions/39643533/custom-analyzer-which-breaks-the-tokens-on-special-characters-and-lowercase-uppe) – Val

+0

是的,它的问题。你能告诉我如何解决这个问题 –

回答

1

创建索引后,您似乎没有将任何数据编入索引。拨打_analyze将不会编制索引,只是简单地向您显示如何分析您发送给ES的内容。

首先,你需要通过指定在您使用您已经定义了分析的映射创建索引:

curl -XPUT 'http://localhost:9200/aida' -d '{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my_analyzer": { 
      "tokenizer": "standard", 
      "char_filter": [ 
      "my_char_filter" 
      ], 
      "filter": [ 
      "uppercase" 
      ] 
     } 
     }, 
     "char_filter": { 
     "my_char_filter": { 
      "type": "pattern_replace", 
      "pattern": "(\\d+)-(?=\\d)", 
      "replacement": "$1 " 
     } 
     } 
    } 
    }, 
    "mappings": {      <--- add a mapping type... 
    "doc": { 
     "properties": { 
     "text": {      <--- ...with a field... 
      "type": "string", 
      "analyzer": "my_analyzer" <--- ...using your analyzer 
     } 
     } 
    } 
    } 
}' 

然后你可以索引一个新的真正的文件:

curl -XPOST 'http://localhost:9200/aida/doc' -d '{ 
    "text": "My name is Soun*arya?jwnne&yuuk" 
}' 

最后,您可以搜索:

curl -XGET 'http://localhost:9200/aida/_search' -d '{ 
    "query":{ 
    "match":{ 
     "text":"My" 
    } 
    } 
}' 
+0

真棒。它现在有效。但有一个小问题 - 它索引完美,搜索也检索我的结果。如果我搜索,例如在文本字段中的名称 - 我仍然只有特殊字符的结果。我无法检索第二步完成的结果(索引文档后的结果) –

+0

源文档不会被ES修改,文本将被分析,标记和索引,但返回的文档将会始终包含与您索引的内容完全相同的内容。 – Val

+0

真棒,很高兴它帮助! – Val