如何强制Elasticsearch query_string将'@'识别为简单字符?
假设我有一个索引,并且我在此声明中添加了一些文档:
<ReactNative.Navigator
...
renderScene={this.renderScene.bind(this)} />
renderScene(route, navigationOperations, onComponentRef) {
switch(route.index) {
case 0:
return <SearchPage />
}
}
我想要这个搜索:
POST test/item/_bulk
{"text": "john.doe@gmail.com"}
{"text": "john.doe@outlook.com"}
{"text": "john.doe@gmail.com, john.doe@outlook.com"}
{"text": "john.doe[at]gmail.com"}
{"text": "john.doe gmail.com"}
仅返回第一个和第三个文档。
我尝试了3种映射: 首先我试过 -
GET test/item/_search
{
"query":
{
"query_string":
{
"query": "*@gmail.com",
"analyze_wildcard": "true",
"allow_leading_wildcard": "true",
"default_operator": "AND"
}
}
}
比我试过 -
PUT test
{
"settings": {
"analysis": {
"analyzer": {
"email_analyzer": {
"tokenizer": "email_tokenizer"
}
},
"tokenizer": {
"email_tokenizer": {
"type": "uax_url_email"
}
}
}
},
"mappings": {
"item": {
"properties": {
"text": {
"type": "string",
"analyzer": "email_analyzer"
}
}
}
}
}
我也试过这个 -
PUT test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "whitespace"
}
}
}
},
"mappings": {
"item": {
"properties": {
"text": {
"type": "string",
"analyzer": "my_analyzer"
}
}
}
}
}
以上都没有,但实际上他们都归还了所有文件。 是否存在分析器/标记器/参数,使Elasticsearch能够像对待任何其他角色一样确认“@”符号
答案 0 :(得分:1)
通过将文本分析为
,这与您的上一次设置有关GET test/item/_search
{
"query":
{
"wildcard":
{
"text": "*@gmail.com*"
}
}
}
使用未分析字段时,您应使用术语级别查询,但不能使用全文级别查询:https://www.elastic.co/guide/en/elasticsearch/reference/2.3/term-level-queries.html