Google App Engine¤ÏÁ´Ê¸¸¡º÷¤¬½ÐÍè¤Ê¤¤¡£
¤Ã¤Æ¤³¤È¤ÇGAE/J¤ÇN-Gram¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤òºî¤Ã¤ÆÁ´Ê¸¸¡º÷¤¹¤ë½èÍý¤ò½ñ¤¤¤Æ¤ß¤¿¡£
¥½¡¼¥¹¤Ï¤³¤³¡£
£±¡¥¸¡º÷ÂоݤÎDatastore¤ËSearchableModel¤òimplements¤·¡¢getKey()¤ÈgetSearchableTextMap()¤ò¼ÂÁõ¡£
getSearchableTextMap()¤ÇÊÖ¤¹Map¤Ï¡¢¸¡º÷Âоݤò»ØÄꤹ¤ëºÝ¤ËÍøÍѤ¹¤ë¥¿¥¤¥×¡ÊǤ°Õ¤Îʸ»úÎó¡Ë¤ò¥¡¼¡¢¸¡º÷ÂоݤÎʸ»úÎó¤ò¥Ð¥ê¥å¡¼¤È¤·¤¿¤â¤Î¤Ç¤¹¡£
¥¤¥ó¥Ç¥Ã¥¯¥¹¤È1Âп¤Î´Ø·¸¤Ë¤¹¤ë¾ì¹ç¤Ï¡¢£²¤Ç½ñ¤¯¥¤¥ó¥Ç¥Ã¥¯¥¹¤ÎDatastore¤ò»ý¤ÄÍͤˤ¹¤ì¤ÐOK¡£
¼ÂÁõÎã
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Target implements SearchableModel {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String name;
@Persistent
private String title;
@Persistent(mappedBy = "source")
private List index = null;
public Key getKey() {
return key;
}
public Map getSearchableTextMap() {
HashMap map = new HashMap();
map.put("name”, this.name);
map.put("title”, this.title);
return map;
}
}
£²¡¥SearchIndexModel¤òimplements¤·¤Æ¡¢¸¡º÷¤ÇÍøÍѤ¹¤ëIndex¤ÎDatastore¤òºîÀ®
getter/setter¤ËÊ»¤»¤Æ¥Õ¥£¡¼¥ë¥É¤òºîÀ®¤·¤Æ²¼¤µ¤¤¡£
jar¥Ñ¥Ã¥±¡¼¥¸Æâ¤ÎDatastore¤òEnhance¤¹¤ëÊýË¡¤¬Ê¬¤«¤é¤Ê¤«¤Ã¤¿¤Î¤Ç¤³¤ó¤ÊÌÌÅݤʼÂÁõ¤Ç¤¹¡¦¡¦¡¦¡£
source¤Î¥Õ¥£¡¼¥ë¥É¤ÏSearchableModel¤Î¼ÂÁõ¥¯¥é¥¹¤Ë¥¥ã¥¹¥È¤·¤Æ²¼¤µ¤¤¡£
¡Ê¤·¤Ê¤¯¤Æ¤âư¤¯¤«¤Ï̤³Îǧ¡¦¡¦¡¦¡Ë
¼ÂÁõÎã¡Ê¥Õ¥£¡¼¥ë¥É¤Îgetter/setter¤Ï¾Êά¡Ë
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Index implements SearchIndexModel {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String text;
@Persistent
private String comparableText;
@Persistent
private int lastPosition;
@Persistent
private String type;
@Persistent
private Target source;
@Persistent
private Key sourceKey;
public int getLastPosition() {
return lastPosition;
}
public void setLastPosition(int lastPosition) {
this.lastPosition = lastPosition;
}
public String getComparableText() {
return comparableText;
}
public void setComparableText(String comparableText) {
this.comparableText = comparableText;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Object getSource() {
return source;
}
public void setSource(Object source) {
this.source = (Target) source;
}
public Key getKey() {
return key;
}
public Key getSourceKey() {
return sourceKey;
}
public void setSourceKey(Key sourceKey) {
this.sourceKey = sourceKey;
}
}
£³¡¥N-Gram¤Î¸¡º÷¥¤¥ó¥Ç¥Ã¥¯¥¹¤ÎºîÀ®¤ª¤è¤Ó¸¡º÷
¤³¤³¤Þ¤Ç½ñ¤±¤Ð¸¡º÷¥¤¥ó¥Ç¥Ã¥¯¥¹¤ÎºîÀ®¤ª¤è¤Ó¸¡º÷¤ÏNgram¥¯¥é¥¹¤Ç´Êñ¤Ë½ÐÍè¤Þ¤¹¡£
// 1-gram¡¢2-gram¡¢3-gram¤Î¸¡º÷¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò¤â¤ÄDatastore¤òºîÀ®
Target target = new Target();
target.setName("HogeHoge");
target.setTitle("HageHage");
List index = Ngram.generateNgramIndex(target, Index.class, 1, 2, 3);
target.setIndex(index);
pm.makePersistent(target);
// 2-gram¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò»È¤¤¡¢Hoge¤ÇName¤ò¸¡º÷
Set searchResult = Ngram.search("Hoge", 2, "name", false, Target.class, Index.class);
// 3-gram¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò»È¤¤¡¢¥¿¥¤¥×¤Î»ØÄê̵¤·¤ÇHoge¤òÛ£Ëæ¡Ê¤Ò¤é¤¬¤Ê/¥«¥¿¥«¥Ê¡¢Âçʸ»ú/¾®Ê¸»ú¡¢Á´³Ñ/Ⱦ³Ñ¤Ê¤É¤òƱ°ì»ë¡Ë¤Ë¸¡º÷
Set searchResult = Ngram.search("Hoge", 3, null, false, Target.class, Index.class);
°ì±þ¡¢Æ°¤¤¤Æ¤Þ¤¹¤¬¿ô»þ´Ö¤Ç¤Ñ¤Ñ¤Ã¤È½ñ¤¤¤¿¥½¡¼¥¹¤Ê¤Î¤Ç´Ö°ã¤Ã¤Æ¤¿¤é¤´»ØÅ¦²¼¤µ¤¤¡£
¤¢¤È¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬¤½¤ì¤Ê¤ê¤Î¥Ç¡¼¥¿Î̤ˤʤ俤ꡢÂоݤ両º÷·ë²Ì¤¬Â¿¤«¤Ã¤¿¤é¥¿¥¤¥à¥¢¥¦¥È¤·¤Á¤ã¤¦¤È¤«ÌäÂꤢ¤ë¤È»×¤¤¤Þ¤¹¡£
¤½¤â¤½¤âÁ´¤¯¸¡º÷¤Î¥¢¥ë¥´¥ê¥º¥à¤ò³Ø¤ó¤À¿Í¤Ç¤Ï¤Ê¤¤¤Î¤ÇÎɤ¯¤Ê¤¤¥½¡¼¥¹¤«¤â¤Ç¤¹¡£
¤Þ¤¡¼ÂÁõ¤Î°ìÎã¤È¤¤¤¦¤³¤È¤Ç¡£
¤È¤¤¤¦¤«¶á¡¹¡¢GAE¤ÇÁ´Ê¸¸¡º÷½ÐÍè¤ëÍͤˤʤ뵤ÇÛ¤À¤±¤É¡£
¤®¤ã¤Õ¤ó¡ª