EdgeNGramsを使用してsolrでオートコンプリート検索に取り組んでいます.solr 3.3を使用しており、複数用語検索のオートコンプリートソリューションとしてsuggesterからの照合を使用したいと考えています。残念ながら、Suggester は複数語検索に対して 1 つの照合のみを返します。
ユーザーが従業員の名前を検索している場合は、オートコンプリートを適用する必要があります。つまり、Google 検索のような結果が必要です。以下の構成で問題なく動作しています。
schema.xml
<fieldType name="edgytext" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="15" side="front" />
</analyzer>
<field name="title" type="edgytext" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true"/>
<field name="empname" type="edgytext" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true" />
<field name="autocomplete_text" type="edgytext" indexed="true" stored="false" multiValued="true" omitNorms="true" omitTermFreqAndPositions="false" />
<copyField source="empname" dest="autocomplete_text"/>
<copyField source="title" dest="autocomplete_text"/>
URL : $http://local:8080/test/suggest/?q=マイケル
Result :
<?xml version="1.0" encoding="UTF-8" ?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
</lst>
<result name="response" numFound="0" start="0" />
<lst name="spellcheck">
<lst name="suggestions">
<lst name="michael">
<int name="numFound">9</int>
<int name="startOffset">0</int>
<int name="endOffset">7</int>
<arr name="suggestion">
<str>michael bolton</str>
<str>michael foret</str>
<str>michael force</str>
<str>michael w. smith featuring andrae crouch</str>
</arr>
</lst>
<str name="collation">michael bolton</str>
</lst>
</lst>
</response>
それは私にとってはうまくいっています。「michael f」で検索すると、以下のようなレスポンスが返ってきます。(http://local:8080/test/suggest/?q=マイケル f)
応答 :
<?xml version="1.0" encoding="UTF-8" ?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
</lst>
<result name="response" numFound="0" start="0" />
<lst name="spellcheck">
<lst name="suggestions">
<lst name="michael">
<int name="numFound">9</int>
<int name="startOffset">0</int>
<int name="endOffset">7</int>
<arr name="suggestion">
<str>michael bolton</str>
<str>michael foret</str>
<str>michael force</str>
<str>michael w. smith featuring andrae crouch</str>
.....
</arr>
</lst>
<lst name="f">
<int name="numFound">10</int>
<int name="startOffset">8</int>
<int name="endOffset">9</int>
<arr name="suggestion">
<str>f**k the facts</str>
<str>fairest lord jesus</str>
<str>franz ferdinand</str>
<str>françois rauber</str>
.........
</arr>
</lst>
<str name="collation">michael bolton f**k the facts</str>
</lst>
</lst>
</response>.
だから、「マイケル f」で検索すると、「マイケル フォレ」と「マイケル フォース」しか出てこないはずです。来るデータは「f」で始まります。solr の構成設定に何か問題がある場合は、提案してください。
前もって感謝します、
アニル。