2016-05-23 55 views
0

我是新的,這裏是我的執行: 我開始與實體及其外地Hibernate Search的:取索引字段包含在使用Hibernate Search的給定的關鍵字

@AnalyzerDef(name = "ngram", 
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), 
filters = { 

    @TokenFilterDef(factory = StandardFilterFactory.class), 
    @TokenFilterDef(factory = LowerCaseFilterFactory.class), 
    @TokenFilterDef(factory = StopFilterFactory.class), 
    @TokenFilterDef(factory = NGramFilterFactory.class, 
    params = { 
     @Parameter(name = "minGramSize", value = "3"), 
     @Parameter(name = "maxGramSize", value = "3") }) 
} 
) 

@Indexed 
@Entity 
@Table(name="USERS") 
public class User { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id; 

    @Field 
    @Column(nullable=false,length=30,name="first_name") 
    private String firstName; 

    @Column(nullable=false,length=30,name="last_name") 
    private String lastName; 


    @Column(length=128) 
    @Field([email protected](definition="ngram")) 
    private String login; 

    @Column(length=255) 
    private String password; 

在我的數據庫,我有2條記錄以下數據:


| id | first_name | last_name |登錄|密碼|


| 1 | NULL | NULL | mednabli | * | | 2 | NULL | NULL | med-nabli | * |

,當我在球場上的登錄應用研究,我展示成果的登錄我得到:

鍵入關鍵字:醫學版

結果:mednabli mednabli

鍵入關鍵字:med-

結果:(沒有),而我需要MED-nabli

鍵入關鍵字:nabli

結果:mednabli而我需要得到mednabli mednabli

鍵入關鍵字:kamed

結果:(沒有),而我需要mednabli mednabli

所以請爲有一種方法可以讓搜索達到預期的結果,是否有一個分析器我應該依靠它來使我的應用程序工作正如我想要的?

回答

1

所以,首先是你只有一個領域不能得到你想要的東西。所以您需要創建另一個字段(請參閱@Fields註釋以在單個屬性上定義多個字段)。這個新字段應該有一個關鍵字標記器和一個小寫的過濾器。然後,您應該通過查詢這兩個字段(帶有應該)來構建您的查詢,其中第二個查詢是通配符查詢「yoursearch」。

這將解決您的所有情況,除了這一個:「鍵入的關鍵字:kamed」。至於這一個,你能提供你如何構建和執行你的查詢?

注意:在登錄搜索中定義Stop過濾器並不是一個好主意,因此您應該將其刪除。

+0

對於關鍵詞kamed,這最後將被分成3克:kam,ame,med,所以我將不得不獲得所有包含「med」的登錄。我會嘗試你的解決方案Ty的回覆:) –