elasticsearch小写,如%term%search

时间:2018-11-01 03:15:39

标签: python elasticsearch

我需要将以下文件路径保存到ES:

/mnt/qfs-X/Asset_Management/XG_Marketing_/Episodic-SG_1001_1233.jpg

我希望能够搜索以下内容并找到匹配项:

search = "qf episodic sg_1001 JPG"

得到一个匹配项,换句话说,它将是一个搜索,例如(my)sql中的以下内容:

select * from table where fp like '%qf%' and fp like '%episodic%' 
and fp like '%sg_1001%' and fp like '%jpg%'

这里有两个问题:

  1. 将其存储在索引中的正确方法是什么?当前,我有一个非常基本(且不正确)的关键字字段-

    body = {
            "mappings": {
                "_doc": {
                    "dynamic": "strict",
                    "properties": {
                        "path":        {"type": "keyword"},
                    }
                }
            }
    }
    

  1. 在ES中搜索以上内容的正确方法是什么?目前我有-

    "query": {
      "bool": {
        "must": [
          { "match": { "fp": "qf" } },
          { "match": { "fp": "episodic" } },
          { "match": { "fp": "sg_1001" } },
          { "match": { "fp": "JPG" } }
        ]
      }
    }
    

1 个答案:

答案 0 :(得分:1)

比方说您的输入是这样的:

/mnt/qfs-X/Asset_Management/XG_Marketing_/Episodic-SG_1001_1233.jpg

我要做的是将所有forward slashunderscore转换为whitespaces

实际上,您的输入现在看起来像是

mnt qfs-X Asset_Management XG Marketing Episodic-SG 1001 1233.jpg

使用下面的standard标记器和token_filter(standard and lowercase)将是您最终拥有的单词列表,这些单词将最终存储在倒排索引中,并可以查询。

mnt qfs X asset management xg marketing episodic sg 1001 1233 jpg

下面是上面的示例映射和查询:

映射

PUT mysampleindex
{  
   "settings":{  
      "analysis":{  
         "analyzer":{  
            "my_analyzer":{  
               "tokenizer":"standard",
               "char_filter":[  
                  "my_char_filter"
               ],
               "filter":[  
                  "standard",
                  "lowercase"
               ]
            }
         },
         "char_filter":{  
            "my_char_filter":{  
               "type":"pattern_replace",
               "pattern":"\\/|_",
               "replacement":" "
            }
         }
      }
   },
   "mappings":{  
      "mydocs":{  
         "properties":{  
            "mytext":{  
               "type":"text",
               "analyzer":"my_analyzer"
            }
         }
      }
   }
}

样本文档

POST mysampleindex/mydocs/1
{
  "mytext": "nt/qfs-X/Asset_Management/XG_Marketing_/Episodic-SG_1001_1233.jpg"
}

样本查询

POST mysampleindex/_search
{  
   "query":{  
      "match":{  
         "mytext":"qfs episodic sg 1001 jpg"
      }
   }
}

请记住,当您将上述查询发送给Elasticsearch时,Elasticsearch会接受输入并在那里应用Search Time Analysis。我建议您阅读此链接,以获取有关此内容的更多信息,以及即使使用以下查询字符串也能获得该文档的原因。

"mytext": "QFS EPISODIC SG 1001 jpg"

现在,如果您尝试使用pisodic(e pisodic )进行搜索(例如,以下面的查询为例),则搜索将不会返回任何内容,因为您的倒排索引不会保存那样的话。对于这种情况,建议您使用N-Gram Tokenizer,以便进一步episodic创建像episodi, pisodic这样的单词,这些单词将存储在倒排索引中。

POST mysampleindex/_search
{  
   "query":{  
      "match":{  
         "mytext":"pisodic"
      }
   }
}

还要注意,我一直在使用text而不是keyword数据类型。 我希望这会有所帮助!