Hi everyone! Diego was kind enough to bring this discussion to my attention - I plan on fixing up that issue he ran into.
Jeremy - if you decide to go with lunr.js but not use my plugin, please feel free to reach out if you have questions about lunr.js! One pitfall I ran into while upgrading from lunr 1.x to 2.x is that lunr's index is immutable by default in 2.x - I ended up writing a plugin to add mutable indexes. Of course, any collaboration on my plugin (along with advice on how to improve it) would be most welcome! -Rob On Thursday, June 28, 2018 at 9:14:27 AM UTC-5, Diego Mesa wrote: > > Hey Jeremy, > > Just wanted to let you know of this plugin: > > https://github.com/hoelzro/tw-full-text-search > > which incorporates lunr.js into TW for full text searching. I just tried > today and am somewhat able to do fuzzy searching with it (does not deal > with immediatel searching properly yet). I have let him know about this > discussion and the corresponding feature request on github, and have opened > an issue on his repo for the fuzzy matching: > > https://github.com/hoelzro/tw-full-text-search/issues/4 > > Perhaps you can reuse some of hoelzro's work? > > Best, > Diego > > On Wednesday, June 27, 2018 at 8:47:06 AM UTC-5, Diego Mesa wrote: >> >> Hey Jeremy, >> >> Thanks for your feedback - I agree search needs to performant. Im glad >> you're also looking at these issues! >> >> A priority for me is the inclusion of *fuzzy* searching - a quick look >> seems lunr does support it: >> >> https://lunrjs.com/guides/searching.html#fuzzy-matches >> >> but elastic does not. >> >> Best, >> Diego >> >> On Wednesday, June 27, 2018 at 2:28:18 AM UTC-5, Jeremy Ruston wrote: >>> >>> Hi Diego >>> >>> Filter operators are often re-executed and so it's important that they >>> perform well. For an expensive operation like a search we need to try to >>> cache as much of the work as we can. >>> >>> An approach that should work is to introduce a new startup module that >>> tracks changes to the store in order to keep the index up to date, and then >>> have the filter operator call a version of the search function that caches >>> the results (and clears the cache when it is invalidated by changes to the >>> tiddler store). >>> >>> Having said that, one of the client projects I'm working on for >>> Federatial looks like it's going to need an enhanced search capability. If >>> the project proceeds to the next phase then I'll be looking at adding a >>> third party search index library -- I've been looking at >>> https://lunrjs.com/ and http://elasticlunr.com/. The API that they >>> feature allows the index to be dynamically modified by adding and removing >>> data incrementally; fuse.js looks like it only accepts a monolithic block >>> of data, and would require a re-index each time the tiddler store changes. >>> >>> Best wishes >>> >>> Jeremy >>> >>> -- >>> Jeremy Ruston >>> jer...@jermolene.com >>> https://jermolene.com >>> >>> On 26 Jun 2018, at 20:45, Diego Mesa <dieg...@gmail.com> wrote: >>> >>> Hey all, >>> >>> Thanks Jeremy for sending that. The following is *more pseduo-code than >>> anything*, but reflects my quick hacking: >>> >>> (function(){ >>> >>> >>> /*jslint node: true, browser: true */ >>> /*global $tw: false */ >>> "use strict"; >>> >>> >>> var fuze = require("$:/plugins/fuzzy/fuze.js"); >>> >>> >>> var options = { >>> shouldSort: true, >>> matchAllTokens: true, >>> threshold: 0.6, >>> location: 0, >>> distance: 100, >>> maxPatternLength: 32, >>> minMatchCharLength: 1, >>> keys: undefined >>> }; >>> >>> >>> /* >>> Export our filter function >>> */ >>> exports.fuzzysearch = function(source,operator,options) { >>> var results = []; >>> >>> >>> source = options.source || $tw.wiki.each; >>> >>> >>> var searchTiddler = function(title){ >>> jsonData = $tw.wiki.getTiddlerAsJson(title) >>> var fuse = new Fuse(jsonData, options); // "list" is the item >>> array >>> var result = fuse.search(operator.operand); >>> return result; >>> }; >>> source(function(tiddler,title) { >>> if(searchTiddler(title) !== options.invert) { >>> results.push(title); >>> } >>> }); >>> >>> >>> console.log("e"); >>> return results; >>> }; >>> >>> >>> })(); >>> >>> I quickly generated this just by looking at: >>> >>> $:/core/modules/filters/search.js >>> >>> which is just a wrapper around: >>> >>> $:/core/modules/wiki.js >>> >>> where exports.search = is defined. >>> >>> The issue is that as you can see from >>> >>> http://fusejs.io/ >>> >>> Fuze works better if it would have access to the entire json string of >>> the wiki, and it can handle the searching and scoring itself. >>> >>> What do you guys think? Any tips to help me move forward? >>> >>> Best, >>> Diego >>> >>> On Tuesday, June 26, 2018 at 8:38:36 AM UTC-5, Jed Carty wrote: >>>> >>>> I hadn't realised it could be done that way. That makes including >>>> external libraries a lot easier than I thought. I am a bit embarrassed >>>> that >>>> I didn't notice you could do that. >>>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "TiddlyWikiDev" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to tiddlywikide...@googlegroups.com. >>> To post to this group, send email to tiddly...@googlegroups.com. >>> Visit this group at https://groups.google.com/group/tiddlywikidev. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/tiddlywikidev/c0e08271-5dd4-4578-b2b3-d4693c27a8b4%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/tiddlywikidev/c0e08271-5dd4-4578-b2b3-d4693c27a8b4%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> For more options, visit https://groups.google.com/d/optout. >>> >>> -- You received this message because you are subscribed to the Google Groups "TiddlyWikiDev" group. To unsubscribe from this group and stop receiving emails from it, send an email to tiddlywikidev+unsubscr...@googlegroups.com. To post to this group, send email to tiddlywikidev@googlegroups.com. Visit this group at https://groups.google.com/group/tiddlywikidev. To view this discussion on the web visit https://groups.google.com/d/msgid/tiddlywikidev/1b2a50b6-1d9b-40c9-a4e1-d8b18cfbd910%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.