luikore / triez

fast, efficient, unicode aware HAT trie with prefix / suffix support for Ruby
MIT License
140 stars 9 forks source link

incorrect result in fulltext search #5

Open andrey-vyatkin opened 8 years ago

andrey-vyatkin commented 8 years ago

ruby 2.0.0, triez 1.0.4

trie = Triez.new(value_type: :object, default: nil)
corpus = ["секс и ничего лишнего", "секса много не бывает", "стив роджерс становится секс-символом америки (2014-07-30 16:20:33)", "люсия и секс", "поговорим о сексе", "секс-файлы: там, где исполняются желания", "время сексуального освобождения", "секс-файлы: мистер икс", "камасутра – самые соблазнительные сексуальные позиции (видео)", "секс, наркотики и рок-н-ролл", "секс и дзен", "секс ангелов", "секс-файлы: обольщение души (соблазнение души)", "секс-файлы: там, где исполняются желания (мир наслаждений)", "секс-файлы: неприкаянные души", "секс и ярость", "секс-файлы: двойная жизнь", "видеогид для влюбленных (камасутра – самые соблазнительные сексуальные позиции)", "дао секса и любви (восточные секреты секса и любви). серия 1", "дао секса и любви (восточные секреты секса и любви). серия 2", "дао секса и любви (восточные секреты секса и любви). серия 3", "дао секса и любви (восточные секреты секса и любви). серия 4", "дао секса и любви (восточные секреты секса и любви). серия 5", "дао секса и любви (восточные секреты секса и любви). серия 6", "дао секса и любви (восточные секреты секса и любви). серия 7", "дао секса и любви (восточные секреты секса и любви). серия 8", "дао секса и любви (восточные секреты секса и любви). серия 9", "дао секса и любви (восточные секреты секса и любви). серия 10", "дао секса и любви (восточные секреты секса и любви). серия 11", "дао секса и любви (восточные секреты секса и любви). серия 12", "дао секса и любви (восточные секреты секса и любви). серия 13", "дао секса и любви (восточные секреты секса и любви). серия 14", "дао секса и любви (восточные секреты секса и любви). серия 15", "дао секса и любви (восточные секреты секса и любви). серия 16", "сексуальные хроники французской семьи", "всё, что вы хотели знать о сексе и налогах", "секс-файлы: виртуальный секс", "секс-файлы: внеземная эротика (эротика пришельцев)", "камасутра в трех измерениях: искусство любви (все, что вы хотите знать о сексе)", "камасутра в трех измерениях: руководство по сексуальным фантазиям (путеводитель в мир сексуальных фантазий)", "видеогид для наслаждения (камасутра – самые соблазнительные сексуальные позиции)", "с начала года выявлено 150 преступлений, связанных с сексуальным насилием над детьми", "больше чем секс", "вслед за германией финляндию захлестнула волна сексуальных преступлений", "в кельне разгорается новый сексуальный скандал", "\"психологии навынос\": почему первый танец с человеком должен быть раньше первого секса с ним.", "секс до и после родов. павел зыгмантович в \"психологии навынос\" ответил на актуальные вопросы.", "\"не бит, не крашен\". е класс: удобно ли в нем заниматься сексом, возить цемент и ездить на шашлыки.", "совет безопасности оон принял резолюцию по борьбе с сексуальным насилием ", "сексуальное настроение", "неудовлетворенное сексуальное напряжение", "полная история моих сексуальных поражений", "секс и 101 смерть", "секс по обмену", "любовь и секс на ибице"]
corpus.each_with_index { |str, id| trie.change_all(:suffix, str) { str } }
str = 'секс'
corpus.select { |str| str.include?(str) } - trie.search_with_prefix(str).map { |_, id| id }.uniq

each word in corpus contains str string, but only 53 out of 55 results are returned during prefix search

luikore commented 8 years ago

_< I'll investigate this weekend

luikore commented 8 years ago

Hi, @dewshick

It works as expected, since your change_all may overwrite previous inserted values so it returns less than 55 results.

To avoid loss in update, you can, for example, store all values in an array:

corpus.each_with_index { |str, id| trie.change_all(:suffix, str) {|arr| arr ||= []; arr << str } }

trie.search_with_prefix(str).flat_map{|_, ids| ids}.uniq.size #=> 55
andrey-vyatkin commented 8 years ago

@luikore Great! Thanks for info! The code was adopted (without thinking too much, my fault) from fulltext search example, maybe it'll be reasonable to write the full text search example same way?

luikore commented 8 years ago

@dewshick good point, I will change the example