diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-08-30 12:33:40 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-08-30 12:33:40 +0200 |
commit | 5c829e26525247280383265d5074044daea6ec64 (patch) | |
tree | 1d082be9c74c0c9e4ca6100eac0e45906be937c7 /container-search/src/main/java/com/yahoo/search/query/Model.java | |
parent | fecfc7d75fd2f4e36a971510f07984a3c32cbe18 (diff) |
Detect language in YQL. Allow multiple languages per query
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/query/Model.java')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/query/Model.java | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/query/Model.java b/container-search/src/main/java/com/yahoo/search/query/Model.java index e7f4640b202..5268600ade6 100644 --- a/container-search/src/main/java/com/yahoo/search/query/Model.java +++ b/container-search/src/main/java/com/yahoo/search/query/Model.java @@ -113,30 +113,43 @@ public class Model implements Cloneable { } /** - * Gets the language to use for parsing. If this is explicitly set, that language is returned, otherwise - * it is guessed from the query string. If this does not yield an actual language, English is - * returned as the default. + * Gets the language to use for parsing. If this is explicitly set in the model, that language is returned. + * Otherwise, if a query tree is already produced and any node in it specifies a language the first such + * node encountered in a depth first + * left to right search is returned. Otherwise the language is guessed from the query string. + * If this does not yield an actual language, English is returned as the default. * * @return the language determined, never null */ public Language getParsingLanguage() { Language language = getLanguage(); - if (language != null) { - return language; - } + if (language != null) return language; + language = Language.fromEncoding(encoding); - if (language != Language.UNKNOWN) { - return language; - } + if (language != Language.UNKNOWN) return language; + + if (queryTree != null) + language = languageBelow(queryTree); + if (language != Language.UNKNOWN) return language; + Linguistics linguistics = execution.context().getLinguistics(); - if (linguistics != null) { + if (linguistics != null) language = linguistics.getDetector().detect(queryString, null).getLanguage(); - } - if (language != Language.UNKNOWN) { - return language; - } + if (language != Language.UNKNOWN) return language; + return Language.ENGLISH; } + + private Language languageBelow(Item item) { + if (item.getLanguage() != Language.UNKNOWN) return language; + if (item instanceof CompositeItem) { + for (Iterator<Item> i = ((CompositeItem) item).getItemIterator(); i.hasNext(); ) { + Language childLanguage = languageBelow(i.next()); + if (childLanguage != Language.UNKNOWN) return childLanguage; + } + } + return Language.UNKNOWN; + } /** Returns the explicitly set parsing language of this query model, or null if none */ public Language getLanguage() { return language; } |