我需要将以下文件路径保存到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" } }
]
}
}
答案 0 :(得分:1)
比方说您的输入是这样的:
/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
数据类型。
我希望这会有所帮助!