Я хочу фильтровать сообщения по некоторым словам (тегам).
Пока только я не хочу сообщений, которые имеют 2 слова.
Мы создали временное дерево, чтобы нам не приходилось искать во всех сообщениях. В лучшем случае я не буду искать один месяц (30 дней).
В этом месяце 57,371 сообщений.
PROFILE
MATCH (startleaf:Hour{hash: '2018/04/01/05'})
, (endleaf:Hour{hash: '2018/04/30/05'})
, p = shortestPath((startleaf)-[:NEXT*0..]->(endleaf))
UNWIND nodes(p) AS leaf
MATCH (leaf)<-[:SENDED]-(message:TS_P2000Message)
WITH distinct message
MATCH (message)-[:HAS_WORD]->(TS_Word { name:'someren'})
WITH distinct message AS message
MATCH (message)-[:HAS_WORD]->(TS_Word { name:'kruisbaan'})
WITH distinct message AS message
WITH count(message) AS results, collect(message) AS messages
UNWIND(messages) AS message
WITH results, message AS message
SKIP 0 LIMIT 15
RETURN results, message
Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 1065560 total db hits in 2244 ms.
просмотреть профиль
Когда мне не нужны все сообщения без фильтра слов, запрос выполняется быстрее!
PROFILE
MATCH (startleaf:Hour{hash: '2018/04/01/05'})
, (endleaf:Hour{hash: '2018/04/30/05'})
, p = shortestPath((startleaf)-[:NEXT*0..]->(endleaf))
UNWIND nodes(p) AS leaf
MATCH (leaf)<-[:SENDED]-(message:TS_P2000Message)
WITH distinct message
WITH count(message) AS results, collect(message) AS messages
UNWIND(messages) AS message
WITH results, message AS message
SKIP 0 LIMIT 15
RETURN results, message
Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 115167 total db hits in 268 ms.
Когда мы меняем запрос на одну неделю, это очень быстро, но для лучшего результата я хочу один месяц.
Так, что я могу сделать, чтобы сделать этот запрос немного быстрее?
Может быть, это поможет, этот экран покажет структуру.
Preview
EDIT:
Когда я не использую слова и делаю ГДЕ с регулярным выражением, это быстрее ...
PROFILE
MATCH (startleaf:Hour{hash: '2018/04/01/05'})
, (endleaf:Hour{hash: '2018/04/30/05'})
, p = shortestPath((startleaf)-[:NEXT*0..]->(endleaf))
UNWIND nodes(p) AS leaf
MATCH (leaf)<-[:SENDED]-(message:TS_P2000Message)
WHERE message.message =~ '(?i).*someren.*' AND message.message =~ '(?i).*kruisbaan.*'
WITH count(message) AS results, collect(message) AS messages
UNWIND(messages) AS message
WITH results, message AS message
SKIP 0 LIMIT 15
RETURN results, message
Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 115186 total db hits in 342 ms.