2015-12-02 115 views
0

我在elasticsearch中存储了“付款参考号”。在Elasticsearch中搜索加密文本

它的布局是例如:2-4-3-6358445698191095312-4-2-635844533758635433

我希望能够或者通过

  1. 使用“整体”参考号码搜索,以搜索由他们支付业务参考号文件,例如放入2-4-2-635844533758635433
  2. 从'开始'的参考编号的任何'部分'。例如。 2-4-2-63(..所以只返回第二个例子)

注意:我不想搜索'中间'或'结束'等仅从一开始。

无论如何,连字符令我困惑。

问题

1)我不知道我是否应该删除它们在映射像

"char_filter" : { 
    "removeHyphen" : { 
     "type" : "mapping", 
      "mappings" : ["-=>"] 
     } 
    }, 

与否。我从来没有以这种方式使用映射,所以不知道这是否有必要。

2)我想我需要一个'ngrams'过滤器,因为我希望能够从存在中搜索参考编号的一部分。我认为像

"partial_word":{ 
    "filter":[ 
     "standard", 
      "lowercase", 
      "name_ngrams" 
     ], 
    "type":"custom", 
    "tokenizer":"whitespace" 
}, 

"name_ngrams":{ 
    "side":"front", 
     "max_gram":50, 
     "min_gram":2, 
    "type":"edgeNGram" 
}, 

我不知道如何把它放在一起的过滤器,但

"paymentReference":{ 
    "type":"string", 
    "analyzer": "??", 
    "fields":{ 
     "partial":{ 
      "search_analyzer":"???", 
      "index_analyzer":"partial_word", 
      "type":"string" 
     } 
    } 
} 

一切,我都试过,似乎总是“休息”在第二个搜索案例中。

如果我做'localhost:9200/orders/_analyze?field=paymentReference&pretty=1' -d "2-4-2-635844533758635433"它总是打破连字符作为自己的令牌,并返回例如与2-这是'很多'的所有文件!而不是我想要的时候2-4-2-6

有人能告诉我如何映射此字段的两种类型的搜索,我试图实现?

更新 - 答

切实什么瓦尔下面说。我只是稍微改变了映射,以更具体的分析器,我也不需要主索引的字符串,因为我只是查询部分。

映射

"paymentReference":{ 
    "type": "string", 
    "index":"not_analyzed", 
    "fields": { 
     "partial": { 
      "search_analyzer":"payment_ref", 
      "index_analyzer":"payment_ref", 
      "type":"string" 
     } 
    } 
} 

分析

"payment_ref": { 
    "type": "custom", 
    "filter": [ 
     "lowercase", 
     "name_ngrams" 
    ], 
    "tokenizer": "keyword" 
} 

过滤

"name_ngrams":{ 
    "side":"front", 
    "max_gram":50, 
    "min_gram":2, 
    "type":"edgeNGram" 
}, 

回答

0

你不需要使用映射字符过滤器这一点。

由于您只需要搜索前缀,因此您使用Edge NGram令牌过滤器处于正确的轨道。我会使用keyword标记器来确保这个术语是作为一个整体来使用的。因此,设置此方式是这样的:

curl -XPUT localhost:9200/orders -d '{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "partial_word": { 
      "type": "custom", 
      "filter": [ 
      "lowercase", 
      "ngram_filter" 
      ], 
      "tokenizer": "keyword" 
     } 
     }, 
     "filter": { 
     "ngram_filter": { 
      "type": "edgeNGram", 
      "min_gram": 2, 
      "max_gram": 50 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "order": { 
     "properties": { 
     "paymentReference": { 
      "type": "string", 
      "fields": { 
      "partial": { 
       "analyzer": "partial_word", 
       "type": "string" 
      } 
      } 
     } 
     } 
    } 
    } 
}' 

然后你可以分析哪些将被收录到您的paymentReference.partial领域:

​​

,你会得到你想要什么,即所有前缀:

{ 
    "tokens" : [ { 
    "token" : "2-", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "2-4", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "2-4-", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "2-4-2", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "2-4-2-", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "2-4-2-6", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "2-4-2-63", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "2-4-2-635", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "2-4-2-6358", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "2-4-2-63584", 
    "start_offset" : 0, 
    "end_offset" : 24, 
    "type" : "word", 
    "position" : 1 
    }, { 
    ... 

最后,你可以搜索任何前缀:

curl -XGET localhost:9200/orders/order/_search?q=paymentReference.partial:2-4-3 
0

不确定通配符搜索是否符合您的需求。我定义了自定义过滤器并设置了preserve_original并生成了数字部分false。以下是示例代码:

PUT test1 
{ 
    "settings" : { 
    "analysis" : { 
     "analyzer" : { 
     "myAnalyzer" : { 
      "type" : "custom", 
      "tokenizer" : "whitespace", 
      "filter" : [ "dont_split_on_numerics" ] 
     } 
     }, 
     "filter" : { 
     "dont_split_on_numerics" : { 
      "type" : "word_delimiter", 
      "preserve_original": true, 
      "generate_number_parts" : false 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "type_one": { 
     "properties": { 
     "title": { 
      "type": "text", 
      "analyzer": "standard" 
     } 
     } 
    }, 
    "type_two": { 
     "properties": { 
     "raw": { 
      "type": "text", 
      "analyzer": "myAnalyzer" 
     } 
     } 
    } 
    } 
} 

POST test1/type_two/1 
{ 
    "raw": "2-345-6789" 
} 

GET test1/type_two/_search 
{ 
    "query": { 
    "wildcard": { 
     "raw": "2-345-67*" 
    } 
    } 
}