Kwangwon (Trey) Yi created ZEPPELIN-6274:
--------------------------------------------

             Summary: Improve Zeppelin Search: Graceful Handling of Leading 
Wildcard Queries
                 Key: ZEPPELIN-6274
                 URL: https://issues.apache.org/jira/browse/ZEPPELIN-6274
             Project: Zeppelin
          Issue Type: Improvement
            Reporter: Kwangwon (Trey) Yi
            Assignee: Kwangwon (Trey) Yi


When users perform searches with leading wildcards (e.g., {{{}*python{}}}, 
{{{}?python{}}}) in Zeppelin’s notebook search, the server logs unnecessary 
error stack traces, even though the UI does not show an error. This ticket aims 
to handle such cases more gracefully to reduce noise in server logs.

 

Server log example:

```

 INFO [2025-08-03 17:50:48,694] (org.apache.zeppelin.rest.NotebookRestApi) 
(\{qtp1992550266-34} NotebookRestApi.java[search]:1189) - Searching notes for: 
*yi ERROR [2025-08-03 17:50:48,718] (org.apache.zeppelin.search.LuceneSearch) 
(\{qtp1992550266-34} LuceneSearch.java[query]:144) - Failed to parse query *yi 
org.apache.lucene.queryparser.classic.ParseException: Cannot parse '*yi': '*' 
or '?' not allowed as first character in WildcardQuery at 
org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:114)
 at org.apache.zeppelin.search.LuceneSearch.query(LuceneSearch.java:130) at 
org.apache.zeppelin.rest.NotebookRestApi.search(NotebookRestApi.java:1195) at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.base/java.lang.reflect.Method.invoke(Method.java:566) at 
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
 at 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:146)
 at 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:189)
 at 
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
 at 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:93)
 at 
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)
 at 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)
 at 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
 at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:274) at 
org.glassfish.jersey.internal.Errors$1.call(Errors.java:248) at 
org.glassfish.jersey.internal.Errors$1.call(Errors.java:244) at 
org.glassfish.jersey.internal.Errors.process(Errors.java:292) at 
org.glassfish.jersey.internal.Errors.process(Errors.java:274) at 
org.glassfish.jersey.internal.Errors.process(Errors.java:244) at 
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:266)
 at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:253) 
at 
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:696)
 at 
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:397) at 
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:349) at 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:358)
 at 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:312)
 at 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
 at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764) at 
org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1665)
 at org.apache.zeppelin.server.CorsFilter.doFilter(CorsFilter.java:70) at 
org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) at 
org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635)
 at 
org.eclipse.jetty.websocket.servlet.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:170)
 at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) at 
org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635)
 at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:527) 
at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:131) 
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:598) 
at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122) 
at 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:223)
 at 
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1580)
 at 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
 at 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1381)
 at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
 at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484) 
at 
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1553)
 at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
 at 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1303)
 at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129) 
at 
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:192)
 at io.micrometer.jetty11.TimedHandler.handle(TimedHandler.java:129) at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122) 
at org.eclipse.jetty.server.Server.handle(Server.java:563) at 
org.eclipse.jetty.server.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1598)
 at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:753) at 
org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:501) at 
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:287) at 
org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:314)
 at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100) at 
org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
 at 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)
 at 
org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)
 at 
org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)
 at java.base/java.lang.Thread.run(Thread.java:829) Caused by: 
org.apache.lucene.queryparser.classic.ParseException: '*' or '?' not allowed as 
first character in WildcardQuery at 
org.apache.lucene.queryparser.classic.QueryParserBase.getWildcardQuery(QueryParserBase.java:700)
 at 
org.apache.lucene.queryparser.classic.MultiFieldQueryParser.getWildcardQuery(MultiFieldQueryParser.java:245)
 at 
org.apache.lucene.queryparser.classic.MultiFieldQueryParser.getWildcardQuery(MultiFieldQueryParser.java:241)
 at 
org.apache.lucene.queryparser.classic.QueryParserBase.handleBareTokenQuery(QueryParserBase.java:820)
 at 
org.apache.lucene.queryparser.classic.QueryParser.Term(QueryParser.java:469) at 
org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:355) 
at 
org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:244) 
at 
org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:215)
 at 
org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:109)
 ... 65 more

```



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to