Возможен ли поиск динамического (веб-страницы) контента с Elasticsearch? - PullRequest
0 голосов
/ 15 июня 2019

Я хочу реализовать функцию поиска по сайту, и я рассматриваю Elasticsearch для нее. Однако каждая веб-страница состоит из различных блоков текста, которые могут или не могут быть просмотрены пользователем, в зависимости от разрешений их учетной записи (например, частная вики). В настоящее время они хранятся в базе данных MySQL.

При выполнении поиска я хочу определить, какие блоки текста доступны для просмотра пользователю для каждой веб-страницы, а затем выполнить поиск / ранжирование по ним. Определение того, какие блоки доступны для просмотра, является относительно простой, но нетривиальной функцией.

Я не вижу, как это сделать эффективно с Elasticsearch. Итак, мой вопрос: возможно ли это сделать с Elasticsearch, и если да, то возможно ли это сделать эффективно? Если нет, то позволяет ли это что-то близкое к этому?

Редактировать: Каждый блок текста (произвольно много) на каждой веб-странице имеет ассоциированное выражение разрешений (например, логическое выражение, в котором каждая переменная указывает, есть ли у пользователя разрешение), которое должно быть удовлетворено, чтобы включить этот блок текста. Эта сложность и заключается в том, что проблема, вероятно, заключается в том, что в долгосрочной перспективе существует сколь угодно много разрешений.

1 Ответ

2 голосов
/ 15 июня 2019

Ну, безусловно, вы можете сделать это, да. Будет ли это эффективно, в зависимости от вашей стратегии, да. Это быстро, это супер быстро.

Вы можете решить использовать один индекс для каждой роли и индексировать только тот контент, который разрешено просматривать пользователю / роли. Затем вы запросите этот индекс в соответствии с ролью вашего пользователя.

Вы можете решить использовать только один индекс с несколькими полями. Вы можете иметь поле для каждой роли и индексировать содержимое соответственно. Не беспокойтесь о дублировании контента. Как и выше, вы решаете, какое поле запрашивать во время запроса, в соответствии с вашими ролями пользователя

Вы можете хранить все свои html-материалы в одном отдельном поле, убирать все html-теги и настраивать анализатор полей, чтобы оставить только некоторые конкретные теги, которые впоследствии можно будет проанализировать как фильтр, чтобы решить, отображать или нет документ в результаты.

В общем, вам нужно только удалить html-тег с помощью html strip char filter в индексное время. Размер поля не имеет значения. Вы можете вставить туда целую страницу без разницы с точки зрения производительности.

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

Это очень просто, но вы поймете идею. Сначала определите, какая часть страницы вы хотите сохранить, какая-то общая, какая-то конкретная ... Дайте мне знать, если это поможет. Это немного сложный вопрос, чтобы ответить на белые знания о вашей стратегии / способности сканирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...