使用Elasticsearch可以搜索动态(网页)内容吗?

时间:2019-06-15 15:03:17

标签: elasticsearch search dynamic-websites

我想实现网站搜索功能,并且正在考虑使用Elasticsearch。但是,每个网页都由不同的文本块组成,取决于用户的帐户权限(例如私有Wiki),这些文本块可能对用户不可见。这些当前存储在MySQL数据库中。

进行搜索时,我想确定每个网页上用户可以看到哪些文本块,然后在这些文本上进行搜索/排名。确定哪些块是可见的是相对简单但重要的功能。

我看不到如何通过Elasticsearch有效地做到这一点。所以我的问题是:这可能与Elasticsearch有关,如果可以,是否有可能有效地做到这一点?如果不能,它是否允许任何类似的东西?

编辑:每个网页上的每个文本块(任意多个)都有一个相关的权限扩展名(例如一个布尔表达式,其中每个变量是否具有权限),必须包含该文本块才能满足。从长远来看,这种复杂性可能是问题所在,因为从长远来看,有许多可能的许可。

1 个答案:

答案 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"
         }
      }
   }
}

这是非常基本的,但是您会明白的。首先,请区分您要存储页面的哪一部分,哪些是常规的,哪些是特定的...让我知道是否有帮助。回答关于爬网策略/功能的先入为主的知识有点困难。