我有以下文件路径需要保存到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"},
}
}
}
}
"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 slash
和underscore
转换为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
数据类型。我希望这有帮助!