Neo4j Быстрый способ сопоставить свойство нечеткого текста - PullRequest
0 голосов
/ 05 ноября 2018

У меня разумное количество узлов (примерно 60 000)

(:Document {title:"A title"})

Учитывая название, я хочу найти соответствующий узел, если он существует. Проблема в том, что название, которое мне дали, не соответствует. То есть иногда началом нового слова является заглавная, а иногда все строчные. Иногда ключевые слова сочетаются с регистром кебаб, иногда они обычно пишутся как ключевые слова.

Чтобы компенсировать это, я использую apoc и расстояние Левенштейна между данным заголовком и каждым узлом и принимаю узел в качестве совпадения, только если он ниже некоторого порога:

MATCH (a:Document)
WHERE apoc.text.distance(a.title, "A title") < 10
RETURN a

Это плохо масштабируется . В настоящее время один поиск занимает около 700 мс , что слишком медленно, учитывая, что он, вероятно, вырастет примерно до 150 000 узлов.

Я думал о сохранении / кэшировании появления альтернативных заголовков в свойстве alias:[...] узла и создании индекса по всем псевдонимам, но я не знаю, возможно ли это в Neo4j.

Каким самым быстрым способом «нечеткого поиска» заголовка является большая база данных узлов?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Индексирование, как отмечалось в ответе Кристофа Виллемсена, определенно необходимо для ускорения поиска, но я также хотел бы указать еще одну историческую функцию, которая могла бы лучше соответствовать вашей «нечеткой находке»:

Soundex - это фонетический алгоритм для индексации имен по звуку, как произносится на английском языке.

0 голосов
/ 05 ноября 2018

В Neo4j 3.5 (в настоящее время на бета03) есть возможности FTS (Полнотекстовый поиск).

РЕДАКТИРОВАТЬ: я написал подробный пост в блоге о FTS в Neo4j: https://graphaware.com/neo4j/2019/01/11/neo4j-full-text-search-deep-dive.html

Затем вы можете запросить документы, используя Синтаксис синтаксического анализатора запросов Lucene .

Создать индекс:

CALL db.index.fulltext.createNodeIndex('documents', ['Document'], ['title','text'])

Импорт некоторых документов:

LOAD CSV WITH HEADERS FROM "file:///docs.csv" AS row
CREATE (n:Document) SET n = row

Запрос документов с заголовком, содержащим "тяжелый тариф"

CALL db.index.fulltext.queryNodes('documents', 'title: "heavy toll"')
YIELD node, score
RETURN node.title, score

╒══════════════════════════════════════════════════════════════════════╤══════════════════╕
│"node.title"                                                          │"score"           │
╞══════════════════════════════════════════════════════════════════════╪══════════════════╡
│"Among Deaths in 2016, a Heavy Toll in Pop Music - The New York Times"│3.7325966358184814│
└──────────────────────────────────────────────────────────────────────┴──────────────────┘

Запрос того же заголовка с опечаткой:

CALL db.index.fulltext.queryNodes('documents', 'title: \\"heavy~ tall~\\"')
YIELD node, score
RETURN node.title, score

Обратите внимание на экранирование кавычек => \ ", строка, передаваемая в базовый синтаксический анализатор, должна содержать кавычки для выполнения запроса фразы вместо логического запроса.

Также tidle рядом с терминами указывают на нечеткий поиск с использованием алгоритма Дамарау-Левенштейна.

╒══════════════════════════════════════════════════════════════════════╤═════════════════════╕
│"node.title"                                                          │"score"              │
╞══════════════════════════════════════════════════════════════════════╪═════════════════════╡
│"Among Deaths in 2016, a Heavy Toll in Pop Music - The New York Times"│0.868073046207428    │
├──────────────────────────────────────────────────────────────────────┼─────────────────────┤
│"Prisons Run by C.E.O.s? Privatization Under Trump Could Carry a Heavy│0.4014900326728821   │
│ Price - The New York Times"                                          │                     │
├──────────────────────────────────────────────────────────────────────┼─────────────────────┤
│"‘All Talk,’ ‘No Action,’ Says Trump in Twitter Attack on Civil Rights│0.28181418776512146  │
│ Icon - The New York Times"                                           │                     │
├──────────────────────────────────────────────────────────────────────┼─────────────────────┤
│"Immigrants Head to Washington to Rally While Obama Is Still There - T│0.24634429812431335  │
│he New York Times"                                                    │                     │
├──────────────────────────────────────────────────────────────────────┼─────────────────────┤
...