2017-10-04 15 views
0

私はlucene検索を休止するのが初めてです。ワードの数日後から、私は特殊文字を使った検索キーワードに取り組んでいます。正確なフレーズ一致とブール検索のためにMultiFieldQueryParserを使用しています。しかし、このプロセスでは、「1年以上の経験がある」などの検索キーワードで結果を得ることができず、検索キーワードを引用符で囲まないと結果が得られます。だから私はluceneクエリの実行で観察されたものは、特別なシンボル(+)をエスケープしています。私はStandardAnalyzer.classを使用しています。 WhiteSpaceAnalyzerを使用している場合、特殊文字はエスケープされませんが、通常のテキストとして扱われる可能性があるため、+ java + php(つまりjavaおよびphp)のようなブール検索に影響する可能性があります。だから、いくつかの提案を助けてください。休止状態の検索で特殊文字を検索する方法は?

次は私の抜粋です。このような効果を制御する

Session session = getSession(); 
     FullTextSession fullTextSession = Search.getFullTextSession(session); 

     MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[] { "student.skills.skill", 
       "studentProfileSummary.profileTitle", "studentProfileSummary.currentDesignation" }, 
       new StandardAnalyzer()); 
     parser.setDefaultOperator(Operator.OR); 
     org.apache.lucene.search.Query luceneQuery = null; 
     QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Student.class).get(); 
     BooleanQuery boolQuery = new BooleanQuery(); 
     if (StringUtils.isEmpty(zipcode) != true && StringUtils.isBlank(zipcode) != true) { 
      boolQuery.add(
        qb.keyword().onField("personal.locations.postalCode").matching(zipcode).createQuery(), 
        BooleanClause.Occur.MUST); 
     } 
     if (StringUtils.isEmpty(query) != true && StringUtils.isBlank(query) != true) { 
      try { 
       luceneQuery = parser.parse(query.toUpperCase()); 
      } catch (ParseException e) { 
       luceneQuery = parser.parse(parser.escape(query.toUpperCase())); 
      } 
      boolQuery.add(luceneQuery, BooleanClause.Occur.MUST); 
     } 
     boolQuery.add(qb.keyword().onField("vStatus").matching(1).createQuery(), BooleanClause.Occur.MUST); 
     boolQuery.add(qb.keyword().onField("status").matching(1).createQuery(), BooleanClause.Occur.MUST); 
     boolQuery.add(qb.range().onField("studentProfileSummary.profilePercentage").from(80).to(100).createQuery(), 
       BooleanClause.Occur.MUST); 
     FullTextQuery createFullTextQuery = fullTextSession.createFullTextQuery(boolQuery, Student.class); 
     createFullTextQuery.setProjection("id", "studentProfileSummary.profileTitle", "firstName","lastName"); 

     if (isEmptyFilter == false) { 
      createFullTextQuery.setFirstResult((int) pageNumber); 
      createFullTextQuery.setMaxResults((int) end); 
     } 
     return createFullTextQuery.list(); 

答えて

1

キーには、使用することを選択したアナライザで確かです。あなたが気づいたように、標準的なAnalyzerは一般的に使用されていないいくつかのシンボルを削除/無視しようとしています。

英語の自然言語では標準的なアナライザーですが、特別な記号も扱っていますので、テキストを複数のフィールドにインデックスし、各フィールドに異なるAnalyzerを割り当てます。両方のフィールドを対象とするクエリを生成し、両方のフィールドから取得したスコアを組み合わせることができます。さまざまな効果を得るために、各フィールドの重みをカスタマイズし、異なるSimilarityの実装を試してみることもできます。

しかし、「1年以上」という具体的な例では、あなたの期待するものを考えてみてください。それは文字列 "6年"に一致する必要がありますか? 次に、このようなパターンを特に探すカスタムアナライザを実装し、シーケンス{"1年"、 "2年"、 "3年"、...}のような複数の一致するトークンを生成するとします。これは効果的だが、その特定の一連の用語にしか一致しないので、より多くの拡張機能をプラグインできるようにLuceneコミュニティのより高度な拡張機能を探したいかもしれない。

+0

@ Sanne.Tqあなたの返信のために私のデータベースに私はプロファイルタイトルと呼ばれるフィールドを持っています。今私は今まで私の検索キーワードmatches.Itと結果を取得したい文字列 "6年"それは" 1年以上の経験がある "というマッチストリングを得なければなりません。 – Satya

関連する問題