Спящий поиск Lucene. Предложение, но почти как SQL & ldquo; LIKE & rdquo;

Это нецелесообразно, но кто я такой, чтобы сказать, что вы не можете этого сделать. У вас может быть веская причина для воспроизведения звука.

Если вы используете Audio Sessions, включите в начале вашего файла, а

[[AVAudioSession sharedInstance]
                setCategory: AVAudioSessionCategoryPlayback
                      error: nil];

должны выполнить трюк. Обратите внимание, что если вы воспроизводите музыку или звуки, воспроизведение iPod будет приостановлено.

Как только это было сделано, возможно, где-то в инициализации одного из ваших классов, который воспроизводит звуки, вы можете создавать такие звуки:

// probably an instance variable: AVAudioPlayer *player;
NSString *path = [[NSBundle mainBundle] pathForResource...];
NSURL *url = [NSURL fileURLWithPath:path];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url];

Когда это будет сделано, вы можете играть с ним в любое время, когда хотите:

[player play]; // Play the sound
[player pause]; // Pause the sound halfway through playing
player.currentTime += 10 // skip forward 10 seconds
player.duration // Get the duration

И другие приятные вещи. Посмотрите ссылку на AVAudioPlayer .

0
задан Nestor Briaga 7 March 2019 в 05:26
поделиться

2 ответа

Необходимо учитывать две вещи:

  • По умолчанию, когда в запросе содержится несколько терминов, результаты будут включать документы, соответствующие любому из термины, а не все терминов.
  • По умолчанию ваши запросы будут анализироваться с использованием того же анализатора, который вы использовали при индексации.

Это, в частности, означает, что ваш запрос "Lychee" будет проанализирован на что-то вроде "L Ly Lyc Lych Lyche Lychee" (из-за фильтра ngram ребра). Строка "Apache Strawberry Club Large" была предварительно проанализирована, а термин "Large" был расширен до "L La Lar Larg Large" из-за фильтра граничной диаграммы. Таким образом, запрос «Lychee» будет соответствовать «Apache Strawberry Club Large», просто потому, что они оба содержат слово, начинающееся с L ...

1113 Это явно нежелательное поведение.

Первым шагом было бы изменение способа анализа вашего запроса, чтобы в конечном итоге вы не совпали с совершенно не связанными документами. По сути, вам нужно определить другой анализатор, который почти идентичен, но не имеет фильтра "edge ngram". Затем вам нужно будет указать Hibernate Search использовать этот анализатор для анализа вашего запроса.

См. этот ответ для подробного объяснения.

В качестве второго шага вам нужно привести в соответствие ваш запрос, если все включенные термины присутствуют в документе. Для этого самым простым решением было бы использование простого запроса строки запроса вместо запроса по ключевому слову.

Заменить это:

Query lucenQuery = qb.keyword().onField("name").matching(searchTerm).createQuery();

На это:

Query lucenQuery = qb.simpleQueryString().onField("name").withAndAsDefaultOperator().matching(searchTerm).createQuery();

Ключом является вызов .withAndAsDefaultOperator().

Это изменение будет иметь несколько других эффектов, таких как включение специального синтаксиса во входной строке, поэтому я рекомендую вам прочитать справочную документацию, чтобы точно знать, что такое simpleQueryString.

0
ответ дан yrodiere 7 March 2019 в 05:26
поделиться

Я заставил это работать благодаря этому, благодаря @yrodiere

@Indexed
@Table (name = "shop_table")
@Entity
@AnalyzerDef(name = "edgeNgram",
    tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),
    filters = {
            @TokenFilterDef(factory = LowerCaseFilterFactory.class),
            @TokenFilterDef(factory = EdgeNGramFilterFactory.class, params = 
                                      { @Parameter(name = "maxGramSize", value = "1024") }),
    })
@AnalyzerDef(name = "search_query_analyzer",
    tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),
    filters = {
            @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
            @TokenFilterDef(factory = LowerCaseFilterFactory.class)
    })
public class Shop implements Serializable {

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


@Field(store = Store.YES, analyze = Analyze.YES)
@Column(name = "name")
@Analyzer(definition = "edgeNgram")
private String name;

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return this.name;
}
}

и моему запросу

  QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Shop.class)
            .overridesForField("name", "search_query_analyzer").get();

    Query lucenQuery = qb.simpleQueryString().onField("name").withAndAsDefaultOperator().matching(shopSearchTerm).createQuery();

Но я не уверен, реализую ли я это при правильном подходе .. [114 ]

0
ответ дан Nestor Briaga 7 March 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: