我有以下文件路径需要保存到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%'

这里有两个问题:
  • 将其存储在索引中的正确方法是什么?目前,我有一个非常基本(且不正确)的关键字字段-
    body = {
            "mappings": {
                "_doc": {
                    "dynamic": "strict",
                    "properties": {
                        "path":        {"type": "keyword"},
                    }
                }
            }
    }
    


  • 在ES中搜索以上内容的正确方法是什么?目前我有-
    "query": {
      "bool": {
        "must": [
          { "match": { "fp": "qf" } },
          { "match": { "fp": "episodic" } },
          { "match": { "fp": "sg_1001" } },
          { "match": { "fp": "JPG" } }
        ]
      }
    }
    
  • 最佳答案

    假设您的输入是这样的:

    /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数据类型。
    我希望这有帮助!

    10-05 19:58