让我们设置一个名为customers / customer的索引/类型。 此集合的每个文档都有一个邮政编码作为属性。 邮政编码基本上可以像这样:
我想将索引分析器设置为获取尽可能多的匹配文档。目前,我是这样工作的:
PUT /customers/
{
"mappings":{
"customer":{
"properties":{
"zip-code": {
"type":"string"
"index":"not_analyzed"
}
some string properties ...
}
}
}
当我搜索文档时,我正在使用该请求:
GET /customers/customer/_search
{
"query":{
"prefix":{
"zip-code":"211-20"
}
}
}
如果您要严格搜索,则可以使用。但是例如,如果邮政编码为“ 200 30”,则使用“ 200-30”进行搜索将不会给出任何结果。 我想给我的索引分析器下订单,以解决这个问题。 有人能帮我吗 ? 谢谢。
P.S。如果您需要更多信息,请让我知道;)
答案 0 :(得分:2)
一旦您要查找变体,就不想使用not_analyzed
。
让我们尝试使用其他映射:
PUT zip
{
"settings": {
"number_of_shards": 1,
"analysis": {
"analyzer": {
"zip_code": {
"tokenizer": "standard",
"filter": [ ]
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"zip": {
"type": "text",
"analyzer": "zip_code"
}
}
}
}
}
我们正在使用标准标记器;字符串将在空格和标点符号(包括破折号)处分解为标记。如果运行以下查询,则可以看到实际的令牌:
POST zip/_analyze
{
"analyzer": "zip_code",
"text": ["8907-1009", "211-20", "30200"]
}
添加示例:
POST zip/_doc
{
"zip": "8907-1009"
}
POST zip/_doc
{
"zip": "211-20"
}
POST zip/_doc
{
"zip": "30200"
}
现在查询工作正常:
GET zip/_search
{
"query": {
"match": {
"zip": "211-20"
}
}
}
如果您仅搜索“ 211”,这也将起作用。但是,这可能太宽容了,因为它还会找到“ 20”,“ 20-211”,“ 211-10”,...
您可能想要的是短语搜索,其中查询中的所有标记都必须位于字段中,并且顺序也正确:
GET zip/_search
{
"query": {
"match_phrase": {
"zip": "211"
}
}
}
添加:
如果邮政编码具有层次结构含义(如果您具有“ 211-20”,则希望在搜索“ 211”时找到它,但在搜索“ 20”时找不到),则可以使用{{3 }}。
因此将映射更改为此:
PUT zip
{
"settings": {
"number_of_shards": 1,
"analysis": {
"analyzer": {
"zip_code": {
"tokenizer": "zip_tokenizer",
"filter": [ ]
}
},
"tokenizer": {
"zip_tokenizer": {
"type": "path_hierarchy",
"delimiter": "-"
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"zip": {
"type": "text",
"analyzer": "zip_code"
}
}
}
}
}
使用上面相同的3个文档,您现在可以使用match
查询:
GET zip/_search
{
"query": {
"match": {
"zip": "1009"
}
}
}
“ 1009”什么都找不到,但是“ 8907”或“ 8907-1009”会找到。
如果您还想找到“ 1009”,但得分较低,则必须分析我显示的两种变体的邮政编码(结合映射的两个版本):
PUT zip
{
"settings": {
"number_of_shards": 1,
"analysis": {
"analyzer": {
"zip_hierarchical": {
"tokenizer": "zip_tokenizer",
"filter": [ ]
},
"zip_standard": {
"tokenizer": "standard",
"filter": [ ]
}
},
"tokenizer": {
"zip_tokenizer": {
"type": "path_hierarchy",
"delimiter": "-"
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"zip": {
"type": "text",
"analyzer": "zip_standard",
"fields": {
"hierarchical": {
"type": "text",
"analyzer": "zip_hierarchical"
}
}
}
}
}
}
}
以相反的顺序添加文档以对其进行正确测试:
POST zip/_doc
{
"zip": "1009-111"
}
然后搜索两个字段,但使用分层标记器将其增加3:
GET zip/_search
{
"query": {
"multi_match" : {
"query" : "1009",
"fields" : [ "zip", "zip.hierarchical^3" ]
}
}
}
然后您会看到“ 1009-111”的得分比“ 8907-1009”的得分高得多。