update suggester

This commit is contained in:
yfujita 2014-01-06 14:38:28 +09:00
parent 17b76c9cf5
commit c8c160c5b5
11 changed files with 258 additions and 237 deletions

2
.gitignore vendored
View file

@ -13,3 +13,5 @@
/src/main/webapp/WEB-INF/db/*.lock.db
/src/main/webapp/WEB-INF/logs/fess*
.classpath
*.iml
.idea

View file

@ -432,7 +432,7 @@
<dependency>
<groupId>jp.sf.fess</groupId>
<artifactId>fess-suggest</artifactId>
<version>1.0.2</version>
<version>1.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>jp.sf.fess</groupId>

View file

@ -26,6 +26,7 @@ import java.net.URLDecoder;
import java.sql.Timestamp;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
@ -64,7 +65,6 @@ import jp.sf.fess.screenshot.ScreenShotManager;
import jp.sf.fess.service.FavoriteLogService;
import jp.sf.fess.service.SearchService;
import jp.sf.fess.suggest.Suggester;
import jp.sf.fess.suggest.SuggesterManager;
import jp.sf.fess.util.FacetResponse;
import jp.sf.fess.util.MoreLikeThisResponse;
import jp.sf.fess.util.QueryResponseList;
@ -145,7 +145,7 @@ public class IndexAction {
protected OpenSearchHelper openSearchHelper;
@Resource
protected SuggesterManager suggesterManager;
protected Suggester suggester;
@Resource
protected DynamicProperties crawlerProperties;
@ -481,30 +481,31 @@ public class IndexAction {
}
final String[] fieldNames = indexForm.fn;
final String[] labels = indexForm.fields.get("label");
final List<SuggestResponse> suggestResultList = new ArrayList<SuggestResponse>();
WebApiUtil.setObject("suggestResultList", suggestResultList);
final List<String> suggestFieldName = new ArrayList<String>();
final List<String> suggestFieldName = Arrays.asList(fieldNames);
WebApiUtil.setObject("suggestFieldName", suggestFieldName);
int suggestRecordCount = 0;
final List<String> labelList;
if (labels == null) {
labelList = new ArrayList<String>();
} else {
labelList = Arrays.asList(labels);
}
try {
for (final String fn : fieldNames) {
final Suggester suggester = suggesterManager.getSuggester(fn);
if (suggester != null) {
final String suggestQuery = suggester
.convertQuery(indexForm.query);
final SuggestResponse suggestResponse = searchService
.getSuggestResponse(fn, suggestQuery, num);
final SuggestResponse suggestResponse = searchService
.getSuggestResponse(indexForm.query, suggestFieldName,
labelList, num);
if (!suggestResponse.isEmpty()) {
suggestRecordCount += suggestResponse.size();
suggestResultList.add(suggestResponse);
suggestFieldName.add(fn);
}
}
if (!suggestResponse.isEmpty()) {
suggestResultList.add(suggestResponse);
}
WebApiUtil.setObject("suggestRecordCount", suggestRecordCount);
WebApiUtil.setObject("suggestRecordCount", 1);
} catch (final Exception e) {
WebApiUtil.setError(1, e);
}

View file

@ -18,7 +18,6 @@ package jp.sf.fess.api;
import jp.sf.fess.helper.LabelTypeHelper;
import jp.sf.fess.helper.QueryHelper;
import jp.sf.fess.suggest.SuggesterManager;
import org.codelibs.core.util.DynamicProperties;
import org.seasar.framework.container.SingletonS2Container;
@ -80,8 +79,4 @@ public class BaseApiManager {
protected LabelTypeHelper getLabelTypeHelper() {
return SingletonS2Container.getComponent("labelTypeHelper");
}
protected SuggesterManager getSuggesterManager() {
return SingletonS2Container.getComponent("suggesterManager");
}
}

View file

@ -38,7 +38,6 @@ import jp.sf.fess.db.allcommon.CDef;
import jp.sf.fess.entity.FieldAnalysisResponse;
import jp.sf.fess.entity.SuggestResponse;
import jp.sf.fess.entity.SuggestResponse.SuggestResponseList;
import jp.sf.fess.suggest.Suggester;
import jp.sf.fess.util.FacetResponse;
import jp.sf.fess.util.FacetResponse.Field;
import jp.sf.fess.util.MoreLikeThisResponse;
@ -370,42 +369,37 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager {
for (final Map.Entry<String, List<String>> entry : suggestResponse
.entrySet()) {
final String fn = suggestFieldName.get(i);
final Suggester suggester = getSuggesterManager()
.getSuggester(fn);
if (suggester != null) {
if (!first1) {
if (!first1) {
buf.append(',');
} else {
first1 = false;
}
final SuggestResponseList srList = (SuggestResponseList) entry
.getValue();
buf.append("{\"token\":");
buf.append(escapeJson(entry.getKey()));
buf.append(", \"fn\":");
buf.append(escapeJson(fn));
buf.append(", \"startOffset\":");
buf.append(Integer.toString(srList.getStartOffset()));
buf.append(", \"endOffset\":");
buf.append(Integer.toString(srList.getEndOffset()));
buf.append(", \"numFound\":");
buf.append(Integer.toString(srList.getNumFound()));
buf.append(", ");
buf.append("\"result\":[");
boolean first2 = true;
for (final String value : srList) {
if (!first2) {
buf.append(',');
} else {
first1 = false;
first2 = false;
}
final SuggestResponseList srList = (SuggestResponseList) entry
.getValue();
buf.append("{\"token\":");
buf.append(escapeJson(entry.getKey()));
buf.append(", \"fn\":");
buf.append(escapeJson(fn));
buf.append(", \"startOffset\":");
buf.append(Integer.toString(srList.getStartOffset()));
buf.append(", \"endOffset\":");
buf.append(Integer.toString(srList.getEndOffset()));
buf.append(", \"numFound\":");
buf.append(Integer.toString(srList.getNumFound()));
buf.append(", ");
buf.append("\"result\":[");
boolean first2 = true;
for (final String value : srList) {
if (!first2) {
buf.append(',');
} else {
first2 = false;
}
buf.append(escapeJson(suggester
.convertResultString(value)));
}
buf.append("]}");
buf.append(escapeJson(value));
}
buf.append("]}");
}
}

View file

@ -37,7 +37,6 @@ import jp.sf.fess.db.allcommon.CDef;
import jp.sf.fess.entity.FieldAnalysisResponse;
import jp.sf.fess.entity.SuggestResponse;
import jp.sf.fess.entity.SuggestResponse.SuggestResponseList;
import jp.sf.fess.suggest.Suggester;
import jp.sf.fess.util.FacetResponse;
import jp.sf.fess.util.FacetResponse.Field;
import jp.sf.fess.util.MoreLikeThisResponse;
@ -318,38 +317,34 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
final SuggestResponseList srList = (SuggestResponseList) entry
.getValue();
final String fn = suggestFieldName.get(i);
final Suggester suggester = getSuggesterManager()
.getSuggester(fn);
if (suggester != null) {
buf.append("<suggest>");
buf.append("<token>");
buf.append(escapeXml(entry.getKey()));
buf.append("</token>");
buf.append("<fn>");
buf.append(escapeXml(fn));
buf.append("</fn>");
buf.append("<start-offset>");
buf.append(escapeXml(Integer.toString(srList
.getStartOffset())));
buf.append("</start-offset>");
buf.append("<end-offset>");
buf.append(escapeXml(Integer.toString(srList
.getEndOffset())));
buf.append("</end-offset>");
buf.append("<num-found>");
buf.append(escapeXml(Integer.toString(srList
.getNumFound())));
buf.append("</num-found>");
buf.append("<result>");
for (final String value : srList) {
buf.append("<value>");
buf.append(escapeXml(suggester
.convertResultString(value)));
buf.append("</value>");
}
buf.append("</result>");
buf.append("</suggest>");
buf.append("<suggest>");
buf.append("<token>");
buf.append(escapeXml(entry.getKey()));
buf.append("</token>");
buf.append("<fn>");
buf.append(escapeXml(fn));
buf.append("</fn>");
buf.append("<start-offset>");
buf.append(escapeXml(Integer.toString(srList
.getStartOffset())));
buf.append("</start-offset>");
buf.append("<end-offset>");
buf.append(escapeXml(Integer.toString(srList
.getEndOffset())));
buf.append("</end-offset>");
buf.append("<num-found>");
buf.append(escapeXml(Integer.toString(srList
.getNumFound())));
buf.append("</num-found>");
buf.append("<result>");
for (final String value : srList) {
buf.append("<value>");
buf.append(escapeXml(value));
buf.append("</value>");
}
buf.append("</result>");
buf.append("</suggest>");
}
}
buf.append("</result>");

View file

@ -16,6 +16,7 @@
package jp.sf.fess.entity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
@ -25,9 +26,12 @@ import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import jp.sf.fess.suggest.SuggestConstants;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.SpellCheckResponse;
import org.apache.solr.client.solrj.response.SpellCheckResponse.Suggestion;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
public class SuggestResponse implements Map<String, List<String>> {
protected String searchQuery;
@ -36,15 +40,11 @@ public class SuggestResponse implements Map<String, List<String>> {
private final Map<String, List<String>> parent = new LinkedHashMap<String, List<String>>();
public SuggestResponse(final QueryResponse queryResponse) {
public SuggestResponse(final QueryResponse queryResponse, final int num,
final String query) {
if (queryResponse != null) {
final SpellCheckResponse spellCheckResponse = queryResponse
.getSpellCheckResponse();
for (final Map.Entry<String, Suggestion> entry : spellCheckResponse
.getSuggestionMap().entrySet()) {
parent.put(entry.getKey(),
new SuggestResponseList(entry.getValue()));
}
parent.put(query, new SuggestResponseList(queryResponse, query));
setSearchQuery(query);
}
}
@ -139,6 +139,30 @@ public class SuggestResponse implements Map<String, List<String>> {
private final int numFound;
public SuggestResponseList(final QueryResponse queryResponse,
final String query) {
final List<String> valueList = new ArrayList<String>();
final List<Integer> frequencyList = new ArrayList<Integer>();
final SolrDocumentList sdList = queryResponse.getResults();
for (final SolrDocument sd : sdList) {
final Object text = sd
.getFieldValue(SuggestConstants.SuggestFieldNames.TEXT);
final Object freq = sd
.getFieldValue(SuggestConstants.SuggestFieldNames.COUNT);
if (text != null && freq != null) {
valueList.add(text.toString());
frequencyList.add(Integer.parseInt(freq.toString()));
}
}
parent = valueList;
frequencies = frequencyList;
frequency = 1;
token = query;
startOffset = 0;
endOffset = query.length();
numFound = (int) queryResponse.getResults().getNumFound();
}
public SuggestResponseList(final Suggestion suggestion) {
parent = suggestion.getAlternatives();
if (parent == null) {

View file

@ -63,8 +63,6 @@ public interface QueryHelper {
String getMoreLikeThisField(String[] field);
String getSuggestQueryType(String fieldName);
boolean isAnalysisFieldName(String fieldName);
FacetInfo getDefaultFacetInfo();

View file

@ -138,8 +138,6 @@ public class QueryHelperImpl implements QueryHelper, Serializable {
protected String highlightingPrefix = "hl_";
protected String suggestPath = "/suggest/";
protected String minimumShouldMatch = "100%";
protected FacetInfo defaultFacetInfo;
@ -1357,24 +1355,6 @@ public class QueryHelperImpl implements QueryHelper, Serializable {
return StringUtils.join(list, ',');
}
@Override
public String getSuggestQueryType(final String fieldName) {
for (final String supported : supportedSuggestFields) {
if (supported.equals(fieldName)) {
return suggestPath + fieldName;
}
}
return null;
}
public String getSuggestPath() {
return suggestPath;
}
public void setSuggestPath(final String suggestPath) {
this.suggestPath = suggestPath;
}
public String getMinimumShouldMatch() {
return minimumShouldMatch;
}

View file

@ -36,13 +36,14 @@ import jp.sf.fess.entity.SearchQuery.SortField;
import jp.sf.fess.entity.SuggestResponse;
import jp.sf.fess.helper.QueryHelper;
import jp.sf.fess.solr.FessSolrQueryException;
import jp.sf.fess.suggest.SuggestConstants;
import jp.sf.fess.suggest.Suggester;
import jp.sf.fess.util.QueryResponseList;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.request.FieldAnalysisRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.util.NamedList;
import org.codelibs.solr.lib.SolrGroup;
import org.codelibs.solr.lib.SolrGroupManager;
@ -57,9 +58,15 @@ public class SearchService implements Serializable {
@Resource
protected SolrGroupManager solrGroupManager;
@Resource
SolrGroup suggestSolrGroup;
@Resource
protected QueryHelper queryHelper;
@Resource
protected Suggester suggester;
public Map<String, Object> getDocument(final String query) {
final List<Map<String, Object>> docList = getDocumentList(query, 0, 1,
null, null, null);
@ -250,42 +257,36 @@ public class SearchService implements Serializable {
return queryResponseList;
}
public SuggestResponse getSuggestResponse(final String fieldName,
final String q, final int rows) {
public SuggestResponse getSuggestResponse(final String q,
final List<String> fieldNames, final List<String> labels,
final int rows) {
final String qt = queryHelper.getSuggestQueryType(fieldName);
if (qt == null) {
throw new FessSolrQueryException("EFESS0001",
new Object[] { fieldName });
}
final String suggestQuery = suggester.buildSuggestQuery(q, fieldNames,
labels);
final long startTime = System.currentTimeMillis();
final SolrGroup solrGroup = solrGroupManager
.getSolrGroup(QueryType.QUERY);
QueryResponse queryResponse = null;
final SolrQuery solrQuery = new SolrQuery();
if (StringUtil.isNotBlank(q)) {
if (StringUtil.isNotBlank(suggestQuery)) {
// query
solrQuery.setQuery(q);
// path
solrQuery.setParam(CommonParams.QT, qt);
solrQuery.setQuery(suggestQuery);
// size
solrQuery.set("spellcheck.count", rows);
solrQuery.setRows(rows);
//sort
solrQuery.setSort(SuggestConstants.SuggestFieldNames.COUNT,
SolrQuery.ORDER.desc);
if (queryHelper.getTimeAllowed() >= 0) {
solrQuery.setTimeAllowed(queryHelper.getTimeAllowed());
}
queryResponse = solrGroup.query(solrQuery, SolrRequest.METHOD.POST);
queryResponse = suggestSolrGroup.query(solrQuery,
SolrRequest.METHOD.POST);
}
final long execTime = System.currentTimeMillis() - startTime;
final SuggestResponse suggestResponse = new SuggestResponse(
queryResponse);
suggestResponse.setSearchQuery(q);
queryResponse, rows, q);
suggestResponse.setExecTime(execTime);
return suggestResponse;
}

View file

@ -1,111 +1,142 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<!-- Manager -->
<component name="suggesterManager" class="jp.sf.fess.suggest.SuggesterManager">
<initMethod name="addSuggester">
<arg>"content"</arg>
<arg>contentSuggester</arg>
<components>
<component name="suggestIntegrateConverter" class="jp.sf.fess.suggest.converter.SuggestIntegrateConverter">
<initMethod name="addConverter">
<arg>
<component name="alphabetConverter" class="jp.sf.fess.suggest.converter.AlphabetConverter" />
</arg>
</initMethod>
<initMethod name="addSuggester">
<arg>"content_ja"</arg>
<arg>contentJaSuggester</arg>
<initMethod name="start"/>
</component>
<component name="suggestIntegrateNormalizer" class="jp.sf.fess.suggest.normalizer.SuggestIntegrateNormalizer">
<initMethod name="addNormalizer">
<arg>
<component name="fullWidthToHalfWidthAlphabetNormalizer" class="jp.sf.fess.suggest.normalizer.FullWidthToHalfWidthAlphabetNormalizer" />
</arg>
</initMethod>
<initMethod name="addSuggester">
<arg>"content_ts"</arg>
<arg>contentTsSuggester</arg>
<initMethod name="addNormalizer">
<arg>
<component name="icuNormalizer" class="jp.sf.fess.suggest.normalizer.ICUNormalizer">
<property name="transliteratorId">"Any-Lower"</property>
</component>
</arg>
</initMethod>
<initMethod name="addSuggester">
<arg>"title_ss"</arg>
<arg>titleSsSuggester</arg>
<initMethod name="start"/>
</component>
<component name="suggester" class="jp.sf.fess.suggest.Suggester">
<initMethod name="setConverter">
<arg>suggestIntegrateConverter</arg>
</initMethod>
<initMethod name="setNormalizer">
<arg>suggestIntegrateNormalizer</arg>
</initMethod>
</component>
<!-- Suggester -->
<component name="contentSuggester" class="jp.sf.fess.suggest.Suggester">
<!-- TODO -->
<!-- Solr Group Configuration -->
<component name="suggestSolrProperties" class="org.codelibs.core.util.DynamicProperties">
<arg>
@jp.sf.fess.util.ResourceUtil@getConfPath("solr-suggest.properties")
</arg>
</component>
<component name="contentJaSuggester" class="jp.sf.fess.suggest.Suggester">
<!-- TODO -->
<component name="suggestSolrGroupProperties" class="org.codelibs.core.util.DynamicProperties">
<arg>
@jp.sf.fess.util.ResourceUtil@getConfPath("suggestSolrGroup.properties")
</arg>
</component>
<component name="contentTsSuggester" class="jp.sf.fess.suggest.Suggester">
<initMethod name="addPreQueryConverter">
<arg>
<component class="jp.sf.fess.suggest.converter.ICUConverter">
<arg>"Fullwidth-Halfwidth"</arg>
</component>
</arg>
</initMethod>
<initMethod name="addPreQueryConverter">
<arg>
<component class="jp.sf.fess.suggest.converter.ICUConverter">
<arg>"Any-Lower"</arg>
</component>
</arg>
</initMethod>
<initMethod name="addPreQueryConverter">
<arg>
<component class="jp.sf.fess.suggest.converter.NormalizeConverter"/>
</arg>
</initMethod>
<initMethod name="addPreQueryConverter">
<arg><component class="jp.sf.fess.suggest.converter.ReadingConverter"/></arg>
</initMethod>
<initMethod name="addPreQueryConverter">
<arg>
<component class="jp.sf.fess.suggest.converter.SymbolConverter">
<initMethod name="addSymbol">
<arg>new String[]{ "0",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "", "", "", "", "",
"", "", "", "", "", " ", " ", "【", "】", "・", "", "",
"(", ")", "%", "", "", "+", "#", "", "\"", "”", "\'", "\\", "¥",
"[", "]", "「", "」", "『", "』", "&lt;", "&gt;", "", "", "/", "", "{",
"}", "&amp;", "", "", "Ⅱ", "Ⅲ", "Ⅳ", "", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ", "",
"", "ⅱ", "ⅲ", "ⅳ", "", "ⅵ", "ⅶ", "ⅷ", "ⅸ", "", "-", "", "." }
</arg>
</initMethod>
</component>
</arg>
<component name="suggestSolrGroup" class="org.codelibs.solr.lib.SolrGroup">
<!-- Note: groupName cannot include ".". -->
<property name="groupName">"suggestSolrServer"</property>
<property name="statusPolicy">
<component class="jp.sf.fess.solr.policy.FessStatusPolicy">
<property name="solrGroupProperties">suggestSolrGroupProperties</property>
<property name="minSelectServer">1</property>
<property name="minUpdateServer">1</property>
<property name="retrySelectQueryInterval">500</property>
<property name="retryUpdateQueryInterval">500</property>
<property name="maxErrorCount">3</property>
<property name="maxRetryUpdateQueryCount">3</property>
<property name="maxRetrySelectQueryCount">3</property>
</component>
</property>
<initMethod name="addServer">
<!-- Note: the server name cannot include ".". -->
<arg>"suggestSolrServer"</arg><!-- Group Name -->
<arg>suggestSolrServer</arg><!-- Solr Server -->
</initMethod>
</component>
<component name="titleSsSuggester" class="jp.sf.fess.suggest.Suggester">
<initMethod name="addPreQueryConverter">
<arg>
<component class="jp.sf.fess.suggest.converter.ICUConverter">
<arg>"Fullwidth-Halfwidth"</arg>
</component>
</arg>
<component name="clientConnectionManager" class="org.apache.http.impl.conn.PoolingClientConnectionManager">
<arg>
<component class="org.apache.http.conn.scheme.SchemeRegistry">
<initMethod name="register">
<arg>
<component class="org.apache.http.conn.scheme.Scheme">
<arg>"http"</arg>
<arg>80</arg>
<arg>@org.apache.http.conn.scheme.PlainSocketFactory@getSocketFactory()</arg>
</component>
</arg>
</initMethod>
<initMethod name="register">
<arg>
<component class="org.apache.http.conn.scheme.Scheme">
<arg>"https"</arg>
<arg>443</arg>
<arg>@org.apache.http.conn.ssl.SSLSocketFactory@getSocketFactory()</arg>
</component>
</arg>
</initMethod>
</component>
</arg>
<arg>10</arg><!-- timeToLive -->
<arg>@java.util.concurrent.TimeUnit@MINUTES</arg><!-- tunit -->
<property name="maxTotal">50</property>
<property name="defaultMaxPerRoute">2</property>
<destroyMethod name="shutdown"></destroyMethod>
</component>
<component name="connectionMonitorTarget" class="org.seasar.robot.client.http.HcConnectionMonitorTarget">
<arg>clientConnectionManager</arg>
<arg>300000</arg>
</component>
<component name="connectionMonitorTask">
@org.seasar.extension.timer.TimeoutManager@getInstance()
.addTimeoutTarget(
connectionMonitorTarget,
10,
true)
<destroyMethod name="cancel"></destroyMethod>
</component>
<!-- Solr Server Configuration -->
<component name="suggestInterceptor" class="org.codelibs.solr.lib.server.interceptor.PreemptiveAuthInterceptor">
</component>
<component name="suggestCredentials" class="org.apache.http.auth.UsernamePasswordCredentials">
<arg>"solradmin"</arg><!-- Username -->
<arg>"solradmin"</arg><!-- Password -->
</component>
<component name="suggestHttpClient" class="org.apache.http.impl.client.DefaultHttpClient">
<arg>clientConnectionManager</arg>
</component>
<component name="suggestSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<!-- Solr Server URL -->
<arg>"http://localhost:8080/solr/core1-suggest"</arg>
<arg>suggestHttpClient</arg>
<property name="requestWriter">new org.apache.solr.client.solrj.impl.BinaryRequestWriter()</property>
<property name="useMultiPartPost">true</property>
<property name="soTimeout">900000</property><!-- 15min -->
<initMethod>
suggestHttpClient.getCredentialsProvider()
.setCredentials(@org.apache.http.auth.AuthScope@ANY, suggestCredentials)
</initMethod>
<initMethod name="addPreQueryConverter">
<arg>
<component class="jp.sf.fess.suggest.converter.ICUConverter">
<arg>"Any-Lower"</arg>
</component>
</arg>
</initMethod>
<initMethod name="addPreQueryConverter">
<arg>
<component class="jp.sf.fess.suggest.converter.NormalizeConverter"/>
</arg>
</initMethod>
<initMethod name="addPreQueryConverter">
<arg><component class="jp.sf.fess.suggest.converter.ReadingConverter"/></arg>
</initMethod>
<initMethod name="addPreQueryConverter">
<arg>
<component class="jp.sf.fess.suggest.converter.SymbolConverter">
<initMethod name="addSymbol">
<arg>new String[]{ "0",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "", "", "", "", "",
"", "", "", "", "", " ", " ", "【", "】", "・", "", "",
"(", ")", "%", "", "", "+", "#", "", "\"", "”", "\'", "\\", "¥",
"[", "]", "「", "」", "『", "』", "&lt;", "&gt;", "", "", "/", "", "{",
"}", "&amp;", "", "", "Ⅱ", "Ⅲ", "Ⅳ", "", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ", "",
"", "ⅱ", "ⅲ", "ⅳ", "", "ⅵ", "ⅶ", "ⅷ", "ⅸ", "", "-", "", "." }
</arg>
</initMethod>
</component>
</arg>
<initMethod>
suggestHttpClient.addRequestInterceptor(suggestInterceptor)
</initMethod>
</component>
</components>