我想实现网站搜索功能,并且正在考虑使用Elasticsearch。但是,每个网页都由不同的文本块组成,取决于用户的帐户权限(例如私有Wiki),这些文本块可能对用户不可见。这些当前存储在MySQL数据库中。
进行搜索时,我想确定每个网页上用户可以看到哪些文本块,然后在这些文本上进行搜索/排名。确定哪些块是可见的是相对简单但重要的功能。
我看不到如何通过Elasticsearch有效地做到这一点。所以我的问题是:这可能与Elasticsearch有关,如果可以,是否有可能有效地做到这一点?如果不能,它是否允许任何类似的东西?
编辑:每个网页上的每个文本块(任意多个)都有一个相关的权限扩展名(例如一个布尔表达式,其中每个变量是否具有权限),必须包含该文本块才能满足。从长远来看,这种复杂性可能是问题所在,因为从长远来看,有许多可能的许可。
答案 0 :(得分:2)
是的,绝对可以。是有效的,取决于您的策略。它很快吗,它超级快。
您可以决定对每个角色使用一个索引,而仅对允许用户/角色查看的特定内容进行索引。然后,您将根据用户的角色对此索引进行查询。
您可以决定只使用一个包含多个字段的索引。您可以为每个角色都有一个字段,并相应地索引内容。不用担心重复内容。如上所述,您可以根据用户角色决定在查询时要查询哪个字段
您可以将所有html内容存储在一个字段中,剥离所有html标签,然后将字段分析器配置为仅保留一些特定的标签,稍后您可以将其解析为过滤器,以决定是否在文档中显示文档。结果。
总而言之,您只需要在索引时使用html strip char filter剥离html标签即可。字段大小无关紧要。您可以在其中粘贴整个页面,而在性能方面没有任何区别。
Elasticsearch非常灵活。您几乎可以做任何您想做的事。这是一项非常棒的技术,值得您投入时间。
以下是您的映射示例:
{
"settings":{
"max_ngram_diff":25,
"number_of_shards":1,
"number_of_replicas":2,
"analysis":{
"normalizer":{
"case_insensitive":{
"filter":"lowercase"
}
},
"tokenizer":{
"word_char_include_slash":{
"type":"simple_pattern",
"pattern":"[\\w\\/]+"
}
},
"char_filter":{
"escaped_tags_h1":{
"type":"html_strip",
"escaped_tags":[
"h1"
]
}
},
"filter":{
"ngram_filter":{
"type":"ngram",
"min_gram":1,
"max_gram":10
}
},
"analyzer":{
"stripped":{
"type":"custom",
"tokenizer":"whitespace",
"filter":[
"lowercase",
"asciifolding",
"ngram_filter"
],
"char_filter":[
"escaped_tags_h1"
]
}
}
}
},
"mappings":{
"properties":{
"meta-description":{
"type":"text"
},
"meta-title":{
"type":"text"
},
"title":{
"type":"text"
},
"url":{
"type":"text"
},
"content-visitor":{
"type":"text",
"analyzer":"stripped"
},
"content-admin":{
"type":"text",
"analyzer":"stripped"
},
"content-editor":{
"type":"text",
"analyzer":"stripped"
},
"created_at":{
"type":"date",
"format":"date_time"
}
}
}
}
这是非常基本的,但是您会明白的。首先,请区分您要存储页面的哪一部分,哪些是常规的,哪些是特定的...让我知道是否有帮助。回答关于爬网策略/功能的先入为主的知识有点困难。