Вопрос по – Как ElasticSearch может быть использован для реализации социального поиска?

20

Я пытаюсь создать бизнес-поиск с помощью социальных функций, используя ElasticSearch. У меня есть бизнес-каталог, и пользователи могут взаимодействовать с этими предприятиями по-разному: просматривая их, проверяя их и т. Д.

Когда пользователь ищет бизнес, я хотел бы иметь возможность показывать ему бизнес, с которым его друзья взаимодействовали, в верхней части результатов (или фильтровать на основе этих взаимодействий).What's the best way to set up my index to achieve this?

Я думаю, у меня есть несколько возможных решений, но я новичок в ES, и я не уверен, что вызовет проблемы:

  1. I could use multi-tennancy and create a separate index for each user. I've ruled this out because the number of users is much greater than the amount of businesses or the amount of user-specific content.

  2. I could add a list of user/score pairs to each indexed business. Every user who has interacted with the business would be in there, and the score would represent the amount of interaction they'd had with the business (this is good enough for my filtering/sorting purposes). Every time they interact with the business, I would update the score in the index. The problem with this is that I only care about my friends' activity, so I would need to figure out some way to take into account who my friends are when creating a composite score for the business. I don't know how to do this in ES.

  3. I could create a similar scheme, but instead of keeping score of my interactions with a business, the score would reflect my friends' interactions with the business. This takes away the need to model my social graph in ElasticSearch, but it does mean that any time a person interacts with a business, I would need to update all of their friends' scores. It would also mean that the list of user/score pairs for each business would be larger, since it'll need to include anybody who has a friend who has interacted with the business.

  4. The final solution I can think of is to keep track of every individual interaction that happens to a business, and add it to business’s document in ES. This doesn’t seem realistic to me – it combines the problems from the other solutions. But it’s probably the most straightforward approach in terms of keeping the index up to date.

Спасибо за вашу помощь!

Я сталкиваюсь с подобной проблемой - делиться мнениями, как вы в конечном итоге решили это? EugeneMi

Ваш Ответ

5   ответов
1

https://issues.apache.org/jira/browse/SOLR-7543

Это позволяет вам помещать документы в свой индекс, которые содержат поле для "node_id" и (многозначное) поле для «edge_id»;

Есть несколько способов структурировать это:

You can have a user document with a list of friend ids on it. Or You can have a separate table that is a link table that links between user records.

Для случая 1: индексировать документ для каждого пользователя в системе с полем, содержащим & quot; user_id & quot; и другое поле, содержащее «friend_ids».

На этом этапе поиск всех друзей для пользователя 555 будет:

{!graph from="user_id" to="friend_ids" maxDepth=1}user_id:555

Найти друзей друзей пользователя

{!graph from="user_id" to="friend_ids" maxDepth=2}user_id:555

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

{!graph from="user_id" to="friend_ids" maxDepth=2 traversalFilter="location:Boston"}user_id:555

Приведенный выше запрос найдет друзей, которые живут в Бостоне, которые являются друзьями пользователя 555, которые живут в Бостоне.

3

но я думаю, что я бы хотел использовать базу данных графиков, такую как Neo4J, где было бы тривиально выполнить такой запрос, как «бизнес, который мои друзья зарегистрировали». и одновременно запрашивать и эту базу данных иasticsearch, и сначала возвращать результаты из базы данных графа. Или вы можете просто получить результаты этого графического запроса и сопоставить результаты вasticsearch (совпадают с идентификаторами), а затем применить увеличение времени запроса к результатам упругого поиска, чтобы они всплыли в верхней части возвращаемых результатов.

8

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

Зайдите на эту страницу, чтобы найти отличное руководство для родителей / детей, которые находятся примерно на полпути:http://www.spacevatican.org/2012/6/3/fun-with-elasticsearch-s-children-and-nested-documents/

Тогда вы можете использоватьфильтр has_child или жезапрос top_children найти только те компании, по которым у ваших друзей есть баллы. Есть несколько предостережений по поводу заказа детских документов, но это рассматривается в этом руководстве, поэтому обязательно прочитайте его до конца.

Затем я просто выполнил бы обычный запрос для всех "несоциальных" пользователей. ранжированные поиски.

В качестве альтернативы, вы можете объединить все воедино и добавить усиления к матчам, которые забили ваши друзья, чтобы все расположилось правильно. Возможно, будет проще выполнить два запроса и объединить их самостоятельно.

5

которые имеют преимущество быть чрезвычайно быстрыми (то есть использовать преимущества, в которых ES является лучшим), но выглядят ужасно для любого, кто знает хотя бы первое о разработке систем хранения / поиска данных.

If your 'business' index is smaller than your 'user' index (i.e. 10,000 biz, 1,000,000 users)

Create 2 indexes: User and Business. Business index should have an 'array' field that holds the ids of every user who has ever "interacted" with it (i.e. "users: 1,4,23,26,127,8678") User index should have a nested array field with business IDs and reviews, checkins, etc in a nested object with meta information (i.e. "business_id:1233,rating: 7.5,checkins:21")

Когда вы ищете компанию, выполните быстрый строковый запрос или отфильтруйте запрос, используя идентификаторы друзей пользователя (ИЛИ конечно) по отношению к бизнес-индексу. Tf-idf должен автоматически фильтровать компании, с которыми ваши друзья чаще всего общались, чтобы ваши пользователи были на вершине. Если вам нужна дополнительная информация, просто нажмите «Индекс пользователя», чтобы получить метаданные для каждого из ваших друзей (рейтинг, проверки и т. Д.). Это должно быть быстро и очень эффективно, потому что ES абсолютно фантастичен в сопоставлении массивов как отдельных терминов Это то, что для тебя!

Если ваш "бизнес" индекс значительно больше, чем у вашего "пользователя"; index, обратный шаблон ... помещение индексированного массива business_ids, с которым пользователь взаимодействовал, в индекс пользователя.

Error: User Rate Limit Exceeded
5

https://github.com/thinkaurelius/titan/wiki/Using-Elastic-Search

Он имеет графический движок, который может работать с Elasticsearch в качестве серверной части. Вы можете выполнить обход графика как (я) - & gt; (друг) - [обзор] - & gt; (бизнес), чтобы найти все эти соединения и скорректировать рейтинг ваших поисков.

Похожие вопросы