Re: fuzzy search and distance tilde
Greg Huber <[email protected]> Tue, 20 Aug 2024 10:45:06 +0100
| Newsgroups | gmane.comp.jakarta.lucene.user |
|---|---|
| Message-ID | <[email protected]> |
Thanks. Switching to SimpleQueryParser does resolve the exceptions,
before I was using classic.QueryParser/MultiFieldQueryParser. The only
difference is the tilde values. I guess these are now integers.
On 19/08/2024 12:32, Uwe Schindler wrote:
> Hi,
>
> Basically, my only recommendation is to NOT use the standard query
> parser in code that is useable from external users. Lucene has
> multiple query parsers, the standard one is a strict one and has a
> stronmg syntax and is therefor not targeted at end-users. This also
> applies to Solr: Use dismax instead of Lucene standard parser there!
> As the standard parser also allows to pass any field name, its is also
> risky to get security issues (people searching on arbitrary fields
> that were not intended to be public). In short: See the default Lucene
> query parser as vulnerable to something like "SQL injection attacks"
> (just replace "SQL" with "Lucene Query Syntax").
>
> For end-user queries I recommend to use the "SimpleQueryParser", which
> throws no exceptions and you can configure which syntax features
> should be enabled and which not. It also does not allow users to pass
> field names, so it is basically written for the use case "user enters
> some search terms without syntax knowledge".
>
> If you want to apply hardcoded filters never every construct plain
> string queries like that, they are always vulnerable to "SQL
> injection" issues. Pass the user-entered queries to SimpleQueryParser
> or don't parse any syntax at all and instead use "match" queries
> (e.g., with Elasticsearch/Opensearch - available in QueryBuilder
> class, e.g.. QueryBuilder#createBooleanQuery). In addition, your
> hardcoded filters are created as native Query instances (like
> TermQuery, PhraseQuery,....). Finally combine the different queries
> constructed with BooleanQuery together and pass the complex result to
> IndexSearcher. For programmatic query construction the Query
> subclasses are the way to go.
>
> Uwe
>
> Am 11.08.2024 um 10:37 schrieb Greg Huber:
>> Looking through my httpd logs I see lots of searches as such
>>
>> /devbox/search?q=%29%20AND%203318%3D4385%20AND%20%287778%3D7778
>>
>> ie : ) AND 3318=4385 AND (7778=7778
>>
>> guess they might be fishing for something.
>>
>> For the fuzzy search I use a different distance values and the
>> default is ~0.6
>>
>> String distance = "~0.6";
>>
>> .........
>>
>> bQueryF.add(queryParser.parse(QueryParser.escape(term)
>> .replace("~", "") + distance),
>> BooleanClause.Occur.MUST);
>>
>>
>> From the query string above I get the error shown below. I added
>> QueryParser.escape(term) but maybe this does nothing here. Is there
>> a way to escape these or configure lecene just to return no results
>> rather than an exception.
>>
>> 2024-08-11 09:19:05,427 ERROR me.search.operations.SearchMe
>> SearchMe:doRun - Error searching index
>>
>> org.apache.lucene.queryparser.classic.ParseException: Cannot parse
>> 'AND~0.6': Encountered " <AND> "AND "" at line 1, column 0.
>>
>> Was expecting one of:
>>
>> <NOT> ...
>>
>> "+" ...
>>
>> "-" ...
>>
>> <BAREOPER> ...
>>
>> "(" ...
>>
>> "*" ...
>>
>> <QUOTED> ...
>>
>> <TERM> ...
>>
>> <PREFIXTERM> ...
>>
>> <WILDTERM> ...
>>
>> <REGEXPTERM> ...
>>
>> "[" ...
>>
>> "{" ...
>>
>> <NUMBER> ...
>>
>> <TERM> ...
>>
>> at
>> org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:141)
>> ~[lucene-queryparser-9.11.1.jar:9.11.1
>> 0c087dfdd10e0f6f3f6faecc6af4415e671a9e69 - 2024-06-23 12:31:02]
>>
>> at
>> org.events.business.search.operations.SearchOperation.doRun(SearchOperation.java:202)
>> [classes/:?]
>>
>> at
>> org.events.business.search.operations.ReadFromIndexOperation.run(ReadFromIndexOperation.java:29)
>> [classes/:?]
>>
>> at
>> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
>> [?:?]
>>
>> at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
>> [?:?]
>>
>> Thanks
>>