diff --git a/src/main/java/org/codelibs/fess/api/suggest/SuggestApiManager.java b/src/main/java/org/codelibs/fess/api/suggest/SuggestApiManager.java index b264599cf..07d886f37 100644 --- a/src/main/java/org/codelibs/fess/api/suggest/SuggestApiManager.java +++ b/src/main/java/org/codelibs/fess/api/suggest/SuggestApiManager.java @@ -18,6 +18,8 @@ package org.codelibs.fess.api.suggest; import static org.codelibs.core.stream.StreamUtil.stream; import java.io.IOException; +import java.util.Locale; +import java.util.Map; import javax.servlet.FilterChain; import javax.servlet.ServletException; @@ -28,6 +30,10 @@ import org.apache.commons.lang.StringUtils; import org.codelibs.core.lang.StringUtil; import org.codelibs.fess.api.BaseApiManager; import org.codelibs.fess.api.json.JsonApiManager; +import org.codelibs.fess.app.service.SearchService; +import org.codelibs.fess.entity.FacetInfo; +import org.codelibs.fess.entity.GeoInfo; +import org.codelibs.fess.entity.SearchRequestParams; import org.codelibs.fess.helper.RoleQueryHelper; import org.codelibs.fess.helper.SuggestHelper; import org.codelibs.fess.suggest.entity.SuggestItem; @@ -57,17 +63,19 @@ public class SuggestApiManager extends BaseApiManager { String errMsg = StringUtil.EMPTY; final StringBuilder buf = new StringBuilder(255); // TODO replace response stream final RoleQueryHelper roleQueryHelper = ComponentUtil.getRoleQueryHelper(); + final SearchService searchService = ComponentUtil.getComponent(SearchService.class); try { - final RequestParameter parameter = RequestParameter.parse(request); + final String[] langs = searchService.getLanguages(request, parameter); final SuggestHelper suggestHelper = ComponentUtil.getSuggestHelper(); final SuggestRequestBuilder builder = suggestHelper.suggester().suggest(); builder.setQuery(parameter.getQuery()); - stream(parameter.getFields()).of(stream -> stream.forEach(field -> builder.addField(field))); - roleQueryHelper.build().stream().forEach(role -> builder.addRole(role)); + stream(parameter.getSuggestFields()).of(stream -> stream.forEach(builder::addField)); + roleQueryHelper.build().stream().forEach(builder::addRole); builder.setSize(parameter.getNum()); + stream(langs).of(stream -> stream.forEach(builder::addLang)); builder.addKind(SuggestItem.Kind.USER.toString()); if (ComponentUtil.getFessConfig().isSuggestSearchLog()) { @@ -144,17 +152,20 @@ public class SuggestApiManager extends BaseApiManager { JsonApiManager.writeJsonResponse(status, buf.toString(), errMsg); } - protected static class RequestParameter { + protected static class RequestParameter implements SearchRequestParams { private final String query; private final String[] fields; private final int num; - protected RequestParameter(final String query, final String[] fields, final int num) { + private HttpServletRequest request; + + protected RequestParameter(final HttpServletRequest request, final String query, final String[] fields, final int num) { this.query = query; this.fields = fields; this.num = num; + this.request = request; } protected static RequestParameter parse(final HttpServletRequest request) { @@ -175,19 +186,74 @@ public class SuggestApiManager extends BaseApiManager { num = 10; } - return new RequestParameter(query, fields, num); + return new RequestParameter(request, query, fields, num); } - protected String getQuery() { + public String getQuery() { return query; } - protected String[] getFields() { + protected String[] getSuggestFields() { return fields; } protected int getNum() { return num; } + + @Override + public Map getFields() { + throw new UnsupportedOperationException(); + } + + @Override + public String[] getLanguages() { + return getParamValueArray(request, "lang"); + } + + @Override + public GeoInfo getGeoInfo() { + throw new UnsupportedOperationException(); + } + + @Override + public FacetInfo getFacetInfo() { + throw new UnsupportedOperationException(); + } + + @Override + public String getSort() { + throw new UnsupportedOperationException(); + } + + @Override + public int getStartPosition() { + throw new UnsupportedOperationException(); + } + + @Override + public int getPageSize() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAdministrativeAccess() { + return false; + } + + @Override + public String[] getExtraQueries() { + throw new UnsupportedOperationException(); + } + + @Override + public Object getAttribute(String name) { + throw new UnsupportedOperationException(); + } + + @Override + public Locale getLocale() { + throw new UnsupportedOperationException(); + } } } diff --git a/src/main/java/org/codelibs/fess/helper/SuggestHelper.java b/src/main/java/org/codelibs/fess/helper/SuggestHelper.java index 40133d425..e59726b8e 100644 --- a/src/main/java/org/codelibs/fess/helper/SuggestHelper.java +++ b/src/main/java/org/codelibs/fess/helper/SuggestHelper.java @@ -127,10 +127,11 @@ public class SuggestHelper { } if (sb.length() > 0) { + final String[] langs = searchLog.getLanguages() == null ? new String[] {} : searchLog.getLanguages().split(","); stream(searchLog.getRoles()).of(stream -> stream.forEach(role -> roles.add(role))); if (fessConfig.isValidSearchLogPermissions(roles.toArray(new String[roles.size()]))) { suggester.indexer().indexFromSearchWord(sb.toString(), fields.toArray(new String[fields.size()]), - tags.toArray(new String[tags.size()]), roles.toArray(new String[roles.size()]), 1); + tags.toArray(new String[tags.size()]), roles.toArray(new String[roles.size()]), 1, langs); } } }); diff --git a/src/main/resources/fess-suggest-default-analyzer.json b/src/main/resources/fess-suggest-default-analyzer.json index f6b9b10de..2cf013585 100644 --- a/src/main/resources/fess-suggest-default-analyzer.json +++ b/src/main/resources/fess-suggest-default-analyzer.json @@ -27,6 +27,45 @@ "type" : "custom", "tokenizer" : "fess_japanese_normal", "filter" : ["stopword_en_filter", "pos_filter", "content_length_filter", "limit_token_count_filter"] + }, + "reading_analyzer_ja" : { + "type" : "custom", + "tokenizer" : "fess_japanese_normal", + "filter" : ["reading_form"] + }, + "reading_term_analyzer_ja" : { + "type" : "custom", + "tokenizer" : "fess_japanese_normal" + }, + "normalize_analyzer_ja" : { + "type" : "custom", + "tokenizer" : "keyword", + "char_filter" : ["mapping_char"], + "filter" : ["lowercase"] + }, + "contents_analyzer_ja" : { + "type" : "custom", + "tokenizer" : "fess_japanese_normal", + "filter" : ["stopword_en_filter", "pos_filter", "content_length_filter", "limit_token_count_filter"] + }, + "reading_analyzer_en" : { + "type" : "custom", + "tokenizer" : "standard" + }, + "reading_term_analyzer_en" : { + "type" : "custom", + "tokenizer" : "standard" + }, + "normalize_analyzer_en" : { + "type" : "custom", + "tokenizer" : "keyword", + "char_filter" : ["mapping_char"], + "filter" : ["lowercase"] + }, + "contents_analyzer_en" : { + "type" : "custom", + "tokenizer" : "standard", + "filter" : ["stemmer_en_filter", "stopword_en_filter", "content_length_filter", "limit_token_count_filter"] } }, "char_filter" : { @@ -138,6 +177,10 @@ "limit_token_count_filter": { "type": "limit", "max_token_count": 10000 + }, + "stemmer_en_filter": { + "type": "stemmer", + "name": "english" } } } diff --git a/src/main/webapp/js/help.js b/src/main/webapp/js/help.js index 9e1043c35..e419dd4d4 100644 --- a/src/main/webapp/js/help.js +++ b/src/main/webapp/js/help.js @@ -30,7 +30,8 @@ $(function(){ ajaxinfo: { url: contextPath + '/suggest', fn: '_default,content,title', - num: 10 + num: 10, + lang: $('#langSearchOption').val() }, boxCssInfo: { border: '1px solid rgba(82, 168, 236, 0.5)', diff --git a/src/main/webapp/js/index.js b/src/main/webapp/js/index.js index b81adf524..ea8d31390 100644 --- a/src/main/webapp/js/index.js +++ b/src/main/webapp/js/index.js @@ -26,7 +26,8 @@ $(function() { ajaxinfo : { url : contextPath + '/suggest', fn : '_default,content,title', - num : 10 + num : 10, + lang : $('#langSearchOption').val() }, boxCssInfo : { border : '1px solid rgba(82, 168, 236, 0.5)', diff --git a/src/main/webapp/js/search.js b/src/main/webapp/js/search.js index 6b96627ce..5246365d8 100644 --- a/src/main/webapp/js/search.js +++ b/src/main/webapp/js/search.js @@ -175,7 +175,8 @@ $(function() { ajaxinfo : { url : contextPath + '/suggest', fn : '_default,content,title', - num : 10 + num : 10, + lang : $('#langSearchOption').val() }, boxCssInfo : { border : '1px solid rgba(82, 168, 236, 0.5)', diff --git a/src/main/webapp/js/suggestor.js b/src/main/webapp/js/suggestor.js index fd067dfe7..2ddc665c0 100644 --- a/src/main/webapp/js/suggestor.js +++ b/src/main/webapp/js/suggestor.js @@ -104,8 +104,10 @@ $.fn.suggestor = function(setting) { cache : false, data:{ query: $textArea.val(), fields: settingAjaxInfo.fn, - num: settingAjaxInfo.num * 2 - } + num: settingAjaxInfo.num * 2, + lang: settingAjaxInfo.lang + }, + traditional: true }).done(function(obj) { suggestor.createAutoCompleteList(obj); }).fail(function(a,obj,b) { suggestingSts=false; return; }); },