Return-Path: Delivered-To: apmail-lucene-java-dev-archive@www.apache.org Received: (qmail 66229 invoked from network); 19 Feb 2010 19:34:59 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 19 Feb 2010 19:34:59 -0000 Received: (qmail 62500 invoked by uid 500); 19 Feb 2010 19:34:58 -0000 Delivered-To: apmail-lucene-java-dev-archive@lucene.apache.org Received: (qmail 62430 invoked by uid 500); 19 Feb 2010 19:34:58 -0000 Mailing-List: contact java-dev-help@lucene.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: java-dev@lucene.apache.org Delivered-To: mailing list java-dev@lucene.apache.org Received: (qmail 62422 invoked by uid 99); 19 Feb 2010 19:34:58 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 19 Feb 2010 19:34:58 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.140] (HELO brutus.apache.org) (140.211.11.140) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 19 Feb 2010 19:34:48 +0000 Received: from brutus.apache.org (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id 123C729A0030 for ; Fri, 19 Feb 2010 11:34:28 -0800 (PST) Message-ID: <1101380035.396521266608068073.JavaMail.jira@brutus.apache.org> Date: Fri, 19 Feb 2010 19:34:28 +0000 (UTC) From: "Robert Muir (JIRA)" To: java-dev@lucene.apache.org Subject: [jira] Updated: (LUCENE-2089) explore using automaton for fuzzyquery In-Reply-To: <1780563173.1258902039668.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/LUCENE-2089?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Robert Muir updated LUCENE-2089: -------------------------------- Attachment: ContrivedFuzzyBenchmark.java attached is a 'contrived fuzzy benchmark' derived from my wildcard benchmark (randomly generated 7-digit terms) for the benchmark, i ran results for various combinations of minimum similarity, prefix length, and pq size for the test index of 10million terms. Avg MS old is the current flex branch. Avg MS new is with the patch. Notes: * only the table for distance n=1 is implemented yet! * n=1 is fast. * Use of the PQ boost attribute speeds up fuzzy queries for higher n slightly, too. * adding a table for n=2 should be extremely helpful, and maybe even enough for the default PQ size of 1024 (BQ.maxClauseCount), to make all fuzzy queries reasonable. {{Minimum Sim = 0.73f (edit distance of 1)}} ||Prefix Length||PQ Size||Avg MS (old)||Avg MS (new)|| |0|1024|3286.0|10.6| |0|64|3320.4|7.2| |1|1024|316.8|5.3| |1|64|314.3|5.3| |2|1024|31.8|4.0| |2|64|31.9|4.2| {{Minimum Sim = 0.58f (edit distance of 2)}} ||Prefix Length||PQ Size||Avg MS (old)||Avg MS (new)|| |0|1024|4223.3|1341.6| |0|64|4199.7|501.9| |1|1024|430.1|304.1| |1|64|392.8|44.7| |2|1024|82.5|70.0| |2|64|38.4|7.7| {{Minimum Sim = 0.43f (edit distance of 3)}} ||Prefix Length||PQ Size||Avg MS (old)||Avg MS (new)|| |0|1024|5299.9|2617.0| |0|64|5231.8|476.4| |1|1024|522.9|318.9| |1|64|480.9|73.9| |2|1024|89.0|83.9| |2|64|46.3|8.6| {{Minimum Sim = 0.29f (edit distance of 4)}} ||Prefix Length||PQ Size||Avg MS (old)||Avg MS (new)|| |0|1024|6258.1|3114.0| |0|64|6247.6|684.6| |1|1024|609.9|380.0| |1|64|567.1|69.3| |2|1024|98.6|93.8| |2|64|55.6|11.4| > explore using automaton for fuzzyquery > -------------------------------------- > > Key: LUCENE-2089 > URL: https://issues.apache.org/jira/browse/LUCENE-2089 > Project: Lucene - Java > Issue Type: Improvement > Components: Search > Affects Versions: Flex Branch > Reporter: Robert Muir > Assignee: Mark Miller > Priority: Minor > Fix For: Flex Branch > > Attachments: ContrivedFuzzyBenchmark.java, LUCENE-2089.patch, LUCENE-2089.patch, LUCENE-2089.patch, LUCENE-2089.patch, LUCENE-2089.patch, LUCENE-2089_concat.patch, Moman-0.2.1.tar.gz, TestFuzzy.java > > > Mark brought this up on LUCENE-1606 (i will assign this to him, I know he is itching to write that nasty algorithm) > we can optimize fuzzyquery by using AutomatonTermsEnum, here is my idea > * up front, calculate the maximum required K edits needed to match the users supplied float threshold. > * for at least small common E up to some max K (1,2,3, etc) we should create a DFA for each E. > if the required E is above our supported max, we use "dumb mode" at first (no seeking, no DFA, just brute force like now). > As the pq fills, we swap progressively lower DFAs into the enum, based upon the lowest score in the pq. > This should work well on avg, at high E, you will typically fill the pq very quickly since you will match many terms. > This not only provides a mechanism to switch to more efficient DFAs during enumeration, but also to switch from "dumb mode" to "smart mode". > i modified my wildcard benchmark to generate random fuzzy queries. > * Pattern: 7N stands for NNNNNNN, etc. > * AvgMS_DFA: this is the time spent creating the automaton (constructor) > ||Pattern||Iter||AvgHits||AvgMS(old)||AvgMS (new,total)||AvgMS_DFA|| > |7N|10|64.0|4155.9|38.6|20.3| > |14N|10|0.0|2511.6|46.0|37.9| > |28N|10|0.0|2506.3|93.0|86.6| > |56N|10|0.0|2524.5|304.4|298.5| > as you can see, this prototype is no good yet, because it creates the DFA in a slow way. right now it creates an NFA, and all this wasted time is in NFA->DFA conversion. > So, for a very long string, it just gets worse and worse. This has nothing to do with lucene, and here you can see, the TermEnum is fast (AvgMS - AvgMS_DFA), there is no problem there. > instead we should just build a DFA to begin with, maybe with this paper: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.652 > we can precompute the tables with that algorithm up to some reasonable K, and then I think we are ok. > the paper references using http://portal.acm.org/citation.cfm?id=135907 for linear minimization, if someone wants to implement this they should not worry about minimization. > in fact, we need to at some point determine if AutomatonQuery should even minimize FSM's at all, or if it is simply enough for them to be deterministic with no transitions to dead states. (The only code that actually assumes minimal DFA is the "Dumb" vs "Smart" heuristic and this can be rewritten as a summation easily). we need to benchmark really complex DFAs (i.e. write a regex benchmark) to figure out if minimization is even helping right now. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org For additional commands, e-mail: java-dev-help@lucene.apache.org