[{"data":1,"prerenderedAt":418},["ShallowReactive",2],{"project-33035580":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":28,"sentiment":29,"stance_mix":30,"scored_comments":35,"aspects":36,"strip":45,"post_text":46,"what":47,"said":73,"maker_in_thread":163,"shape":174,"grid":178,"attempts":381,"same_week":382,"maker_shows":288,"maker_hidden":410,"reader_version":411,"card":412},"33035580","uFuzzy.js","A tiny, efficient fuzzy search that doesn't suck","title","Show HN: uFuzzy.js – A tiny, efficient fuzzy search that doesn't suck","https:\u002F\u002Fgithub.com\u002Fleeoniya\u002FuFuzzy","github.com","leeoniya",1664549089,2022,251,82,192,2570,8,"legend","languages","javascript search library","library",[24,25,26,27],"fuzzy search","javascript","typeahead","full text search","curious",-0.067,{"positive":31,"neutral":32,"mixed":33,"critical":34},5,19,0,9,33,{"execution":37,"docs":39,"idea":41,"performance":44},{"positive":33,"critical":38},4,{"positive":40,"critical":40},1,{"positive":42,"critical":43},2,3,{"positive":42,"critical":40},[40,31,43,43,31,43,43,40,33,43,40,43,43,33,33,33,40,40,43,43,40,40,33,33,31,43,43,33,31,43,40,43,31,43,33,40,43,43,33,33],"Hello HN!\n\nI became frustrated with the unpredictible\u002Fpoor match quality and opaqueness of \"relevance scores\" in existing fuzzy and fulltext search libs, so I tried something different and this is the result. The main selling point is the result quality \u002F ordering, with best-in-class memory overhead and excellent performance being bonuses. The API is pretty stable at this point, but looking for feedback before committing to 1.0.\n\nTL;DR\n\nThe test corpus is a 4MB json file with 162k words\u002Fphrases, so give it a second for initial download. You can also drag\u002Fdrop your own text\u002Fjson corpus into the",{"problem":48,"audience":54,"pricing":54,"motivation":55,"time_to_build":54,"stack":59,"openness":70,"stage":71,"team_size":72},{"value":49,"source":50,"evidence":51},"Poor match quality and opaque relevance scores in existing fuzzy and full-text search libraries","maker",[52],{"id":53},"post",null,{"value":56,"source":50,"evidence":57},"Frustration with relevance scoring and match quality in existing search libraries",[58],{"id":53},[60,64],{"value":61,"source":50,"evidence":62},"JavaScript",[63],{"id":53},{"value":65,"source":50,"evidence":66},"Regular expressions (core matching)",[67],{"id":68,"by":11,"text":69},"33041786","yep. the core is regexp based and there is no string distance assertion during initial pre-filtering, so this wont be a use case uFuzzy can accomodate. the intro does caveat that…","open_source","beta","unknown",{"praise":74,"objections":87,"requests":113,"questions":131,"alternatives":143},[75],{"value":76,"source":77,"evidence":78},"Comparison table is useful and the library is small and well-scored","commenter",[79,83],{"id":80,"by":81,"text":82},"33042231","swyx","your comparisons table at the bottom is worth its weight in gold. ignore the haters, thank you OP",{"id":84,"by":85,"text":86},"33041428","simonw","I'm impressed. 3.54KB minified, great performance, good results.",[88,103],{"value":89,"source":77,"evidence":90},"Does not handle substitution typos well or missing spaces",[91,95,99],{"id":92,"by":93,"text":94},"33041722","moralestapia","Thank you for this! I am also quite frustrated with the current state of full text search in the javascript world. All libs I've tried miss the most basic examples and their…",{"id":96,"by":97,"text":98},"33042869","trinovantes","It doesn't seem to handle missing spaces https:\u002F\u002Fleeoniya.github.io\u002FuFuzzy\u002Fdemos\u002Fcompare.html?libs=uFuzzy,fuzzysort,QuickScore&search=lanoel",{"id":100,"by":101,"text":102},"33045896","systemz","From fuzzy search I expected that entering \"super meet boy\" or \"super maet boy\" will return \"Super Meat Boy\" but unfortunately currently it doesn't work this way and it's quite…",{"value":104,"source":77,"evidence":105},"Behaves more like grep than fuzzy search; ordering is weak",[106,110],{"id":107,"by":108,"text":109},"33045143","molf","I have spent many days searching for the best JavaScript implementation of full text search that handles typos (substitutions) well. Implementing a good indexing algorithm for…",{"id":111,"by":108,"text":112},"33045934","A blunt answer to your question is: I didn't take the time to read everything. Sorry for missing that feature. I stand by my overall point though. There is more to search than…",[114,124],{"value":115,"source":77,"evidence":116},"Better typo tolerance, especially substitutions",[117,120],{"id":118,"by":93,"text":119},"33043003","Sure, but then that's pretty much the core thing to solve on the fuzzy search problem. Anyway, not being a hater (as that other commenter suggested), if you could add support for…",{"id":121,"by":122,"text":123},"33045820","magicalhippo","> even if it's limited, one or two typos at most This would help a lot I think. When I'm on mobile, the most common error is \"keyboard offset error\", where I hit a \"key\" next to…",{"value":125,"source":77,"evidence":126},"Document the ES module build",[127],{"id":128,"by":129,"text":130},"33078116","lloydatkinson","Document it then!",[132],{"value":133,"source":77,"evidence":134},"How does it compare to Fuse.js and Levenshtein",[135,139],{"id":136,"by":137,"text":138},"33042147","jaitaiwan","Out of curiosity, how does this compare with fuse.js?",{"id":140,"by":141,"text":142},"33045349","dvh","How does it compare to levenstein?",[144,148,152,156],{"value":145,"source":77,"evidence":146},"Fuse.js",[147],{"id":136,"by":137,"text":138},{"value":149,"source":77,"evidence":150},"MiniSearch",[151],{"id":107,"by":108,"text":109},{"value":153,"source":50,"evidence":154},"FlexSearch",[155],{"id":68,"by":11,"text":69},{"value":157,"source":77,"evidence":158},"fuzzysort",[159],{"id":160,"by":161,"text":162},"33041853","forrestthewoods","Skimming I don’t think you have my code. Also on phone so may have missed it. Amusingly you do have Hearthstone cards and UE4 filenames whose data definitely comes from my post.…",{"comments":164,"answered":165,"key":166},32,13,[167,168,171],{"id":68,"text":69},{"id":169,"text":170},"33042373","> ignore the haters i'm an OSS dev; how thin do you think my skin is? :D",{"id":172,"text":173},"33042665","i'm curious how a regexp can handle arbitrary substitutions. afaik you need to be explicit about what alterations can occur for each character, but if that list is arbitray, then…",{"commenters":175,"max_depth":18,"maker_replies":164,"first_comment_mins":176,"lifespan_hours":177},35,442,118,[179,181,183,185,187,190,193,194,195,197,201,204,206,207,209,211,214,215,217,219,221,224,225,227,230,232,235,238,240,243,245,246,248,250,251,253,255,257,260,262,264,266,269,271,275,278,280,282,284,286,291,293,296,298,301,305,307,311,315,318,320,322,326,329,333,335,338,341,343,347,349,354,356,360,362,364,366,367,369,374,377,379],[92,33,40,180,93,33],"project\u002Fcritical\u002Fexecution",[68,33,33,182,11,40],"project\u002Fneutral\u002Fidea",[80,33,31,184,81,33],"maker\u002Fpositive\u002Fdocs",[169,33,33,186,11,40],"commenter\u002Fneutral\u002Fnone",[188,33,33,186,189,33],"33043967","llanowarelves",[191,33,43,182,192,33],"33042564","rjh29",[172,33,33,182,11,40],[118,33,43,182,93,33],[196,33,33,182,11,40],"33043030",[198,33,31,199,200,33],"33043235","project\u002Fpositive\u002Fidea","tbeseda",[202,33,33,203,11,40],"33043293","project\u002Fneutral\u002Fperformance",[205,33,43,182,122,33],"33045837",[121,33,43,182,122,33],[208,33,43,182,192,33],"33052815",[107,33,40,210,108,33],"project\u002Fcritical\u002Fidea",[212,33,33,213,11,40],"33045697","commenter\u002Fneutral\u002Fdocs",[111,33,33,186,108,33],[216,33,33,182,11,40],"33046014",[218,33,43,182,108,33],"33046069",[220,33,33,186,11,40],"33046120",[222,33,33,223,11,40],"33056406","project\u002Fneutral\u002Fexecution",[100,40,40,180,101,33],[226,40,33,182,11,40],"33045931",[228,40,43,182,229,33],"33046240","tomtomtom777",[231,40,33,182,11,40],"33046315",[233,40,43,182,234,33],"33047060","comfypotato",[236,40,33,186,237,33],"33061761","greenhatman",[239,40,33,223,11,40],"33053180",[241,42,33,242,161,33],"33041649","other\u002Fneutral\u002Fnone",[244,42,33,182,11,40],"33041679",[160,42,33,186,161,33],[247,42,33,186,11,40],"33041879",[249,42,33,242,161,33],"33042702",[96,43,40,180,97,33],[252,43,33,223,11,40],"33042917",[254,43,40,180,97,33],"33043207",[256,43,33,223,11,40],"33043270",[258,38,43,182,259,33],"33041619","chiefalchemist",[261,38,33,182,11,40],"33041725",[263,38,33,186,259,33],"33042268",[265,31,43,223,129,33],"33045459",[267,31,33,268,11,40],"33045849","project\u002Fneutral\u002Fdocs",[128,31,40,270,129,33],"project\u002Fcritical\u002Fdocs",[272,273,40,210,274,33],"33050846",6,"eurasiantiger",[276,273,33,242,277,33],"33051203","toombowoombo",[279,273,33,242,274,33],"33053514",[281,273,33,186,11,40],"33051544",[283,273,33,186,274,33],"33053547",[285,273,33,182,11,40],"33055014",[287,288,43,289,290,33],"33042854",7,"project\u002Fneutral\u002Fnone","brycewray",[84,18,31,292,85,33],"project\u002Fpositive\u002Fperformance",[294,34,43,182,295,33],"33042905","bhl",[297,34,33,203,11,40],"33042945",[299,34,43,203,300,33],"33044387","netghost",[302,303,43,182,304,33],"33042979",10,"modzu",[306,303,33,182,11,40],"33043016",[308,309,33,242,310,33],"33094440",11,"easytiger",[312,313,33,242,314,33],"33045194",12,"hrdwdmrbl",[316,165,31,199,317,33],"33044847","davedx",[136,319,43,182,137,33],14,[321,319,33,203,11,40],"33042165",[323,319,40,324,325,33],"33042999","project\u002Fcritical\u002Fperformance","91edec",[327,319,33,328,11,40],"33043069","maker\u002Fneutral\u002Fperformance",[330,319,33,331,332,33],"33044792","commenter\u002Fneutral\u002Fperformance","phist_mcgee",[334,319,43,203,304,33],"33043014",[336,319,33,337,11,40],"33043084","maker\u002Fneutral\u002Fnone",[339,340,31,292,332,33],"33044783",15,[342,340,33,292,11,40],"33045893",[344,345,43,182,346,33],"33044137",16,"tonto",[348,345,33,182,11,40],"33046199",[350,351,33,352,353,33],"33042345",17,"other\u002Fneutral\u002Fidea","encryptluks2",[355,351,33,242,11,40],"33042364",[357,358,40,210,359,33],"33044957",18,"mo_po2",[361,358,33,186,11,40],"33045736",[363,358,43,337,359,33],"33053673",[365,358,33,182,11,40],"33056329",[140,32,43,182,141,33],[368,32,33,182,11,40],"33045792",[370,371,33,372,373,33],"33041492",20,"other\u002Fcritical\u002Fnone","throwaway14356",[375,371,33,186,376,33],"33041846","aaaaaaaaaaab",[378,371,33,242,11,40],"33041971",[380,371,33,352,373,33],"33043921",[],[383,388,392,397,401,405],{"id":384,"name":385,"points":386,"category":387},"33049046","SigNoz",510,"dev_tools",{"id":389,"name":390,"points":391,"category":20},"33068017","Javalin",377,{"id":393,"name":394,"points":395,"category":396},"33038117","GhostlyStock",190,"ai",{"id":398,"name":399,"points":400,"category":387},"33094627","Sharing",189,{"id":402,"name":403,"points":404,"category":387},"33089131","Async UI",173,{"id":406,"name":407,"points":408,"category":409},"33094720","kafka-worker",148,"infrastructure",false,"v2",{"id":413,"name":5,"line":6,"ai":410,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":414,"top":18,"kw":415,"maker":11,"domain":10,"tier":19,"attempts":33,"strip":416,"url":9,"mix":417,"praise":76,"objection":89,"sub":21},33035580,-0.07,[24,25,26,27],"1533533103133000113311005330531353013300",[31,32,33,34],1793991052378]