public class CustomAnalyzer extends Analyzer {
public static final int DEFAULT_MAX_TOKEN_LENGTH = 255;
private int maxTokenLength = DEFAULT_MAX_TOKEN_LENGTH;
@Override
protected Analyzer.TokenStreamComponents createComponents(final String fieldName,final Reader reader) {
final ClassicTokenizer src = new ClassicTokenizer(getVersion(), reader);
src.setMaxTokenLength(maxTokenLength);
TokenStream tok = new ShingleFilter(src,2,3);
tok = new ClassicFilter(tok);
tok = new LowerCaseFilter(tok);
// tok = new SynonymFilter(tok,SynonymDictionary.getSynonymMap(),true);
return new Analyzer.TokenStreamComponents(src, tok) {
@Override
protected void setReader(final Reader reader) throws IOException {
src.setMaxTokenLength(CustomAnalyzer.this.maxTokenLength);
super.setReader(reader);
}
};
}
}
public class Test {
public static void main(String[] args) throws Exception {
Directory dir = new NIOFSDirectory(new File("/home/local/test"));
IndexReader indexReader = DirectoryReader.open(dir);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
CustomAnalyzer analyzer1 = new CustomAnalyzer();
TokenStream ts=new CustomSynonymAnalyzer().tokenStream("n",new StringReader("cup board"));
ts.reset();
System.out.println("Tokens are :");
while (ts.incrementToken()) {
System.out.print(ts.getAttribute(CharTermAttribute.class) + ", ");
}
QueryParser parser = new QueryParser("n", analyzer1);
Query query = null;
query = parser.parse("cup board");
System.out.println("\nQuery is");
System.out.println(query.toString());
}
}
Lucene 4.10.4를 사용하고 있습니다. 위 코드의 출력은 다음과 같습니다.
Tokens are :
cup, cup board, board
Query is
n:cup n:board
결과 쿼리는 n : cup n : board n : cup board 가 될 것으로 예상합니다 . 그러나 shingle 필터에 의해 형성된 토큰 은 쿼리에 추가되지 않습니다. n : cup n : board 만 얻 습니다 . 내 실수는 어디에 있습니까?
이러한 토큰은 분석기에 의해 분할되지 않고 QueryParser 구문에 의해 분할됩니다. 절은 공백으로 구분되므로 별도의 용어가 아니라 별도의 쿼리 절 입니다.
차이점을 확인하려면 구문 쿼리를 시도하십시오. parser.parse("\"cup board\"");
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다